
Vyacheslav
25.10.2018
14:37:39

Constantine
25.10.2018
14:38:41
Типичные проблемы для функционального стиля программирования, как я понимаю

Vyacheslav
25.10.2018
14:41:31
В общем из языков, которые не имеют императивов времени жизни
Я бы не обзывал только автоматические объекты объектами, которые имеют императивы времени жизни. Для примера, вот тот самый COM, у которого при правильной расстановке переменных, они ведут себя как автоматические объекты:
https://github.com/slavanap/ssifSource/blob/master/ssifSource/Filter.ssifSource.cpp#L153

Google

Constantine
25.10.2018
14:43:00

Vyacheslav
25.10.2018
14:43:51

Constantine
25.10.2018
14:44:21

Alexander
25.10.2018
14:44:25


Constantine
25.10.2018
14:44:43
Смысл не в том, что возвращается, а в том, что отдавший объект может потребовать прекратить его использовать
Это строгие гарантии времени смерти, которые безумно важны для непроверяемых ссылок
Заметьте, что я там [this] замыкаю без всяких проверок, потому что у меня есть такие гарантии
В итоге через весь гуй во всех callback-ах этот this замыкается через макрос только ради дебажной проверки что все соблюдают правила
Хорошо, что мне не нужно читать этот код
Да, вот еще одно очень интересное замечание. Ваш пример содержал прошивку shared_ptr<B> в определение А. Классом А (ресурс!) мог быть, например, файл, сетевое соединение или контроллер передачи сообщений, который вообще не слышал про класс В. В этом случае разница между нашими примерами неожиданно обнулится, если заметить, что ref_with_guard это более слабая версия вашего pair<A, shared_ptr<B>>, потому что ref_with_guard ничего не мешает быть именно такой парой (тройкой, в неё же надо положить параметр запроса), если В управляется счетчиком ссылок.


Vyacheslav
25.10.2018
15:05:49
Да, вот еще одно очень интересное замечание. Ваш пример содержал прошивку shared_ptr<B> в определение А. Классом А (ресурс!) мог быть, например, файл, сетевое соединение или контроллер передачи сообщений, который вообще не слышал про класс В. В этом случае разница между нашими примерами неожиданно обнулится, если заметить, что ref_with_guard это более слабая версия вашего pair<A, shared_ptr<B>>, потому что ref_with_guard ничего не мешает быть именно такой парой (тройкой, в неё же надо положить параметр запроса), если В управляется счетчиком ссылок.
Замечу, что с файлом и сетевым соединением я обычно веду работу через методы обрамляющего класса B, а не напрямую обращаясь к A

Constantine
25.10.2018
15:07:53
Ваше замечание верно в части - класс, требующий обязательного В, очень похож на часть В и будет работать немного по-другому

Google

Constantine
25.10.2018
15:11:58

Andrew
25.10.2018
15:32:56
Насколько я понял, вы выше пытались получить ссылку на nullpt? Насколько я знаю, шланг в какой-то версии в районе 3.9 переставал это собирать, не знаю, как сейчас.
Это про переносимость.

Constantine
25.10.2018
15:39:46
std::array<int, 0>{}.front() это переносимый аналог __builtin_unreachable? :)

Александр
25.10.2018
15:40:42
как можно надеяться на UB?

Constantine
25.10.2018
15:41:07

Александр
25.10.2018
15:41:40

Constantine
25.10.2018
15:41:58
это же constexpr проверяемая ошибка

Александр
25.10.2018
15:42:18

Constantine
25.10.2018
15:42:40
Александр говорит, что оно обязано скомпилироваться
И результат вызова будет UB :)

Александр
25.10.2018
15:43:33
а я вот не согласен
но я тоже Александр

Constantine
25.10.2018
15:43:58
Ну я смутно надеюсь, что оно обязано не скомпилироваться
И дефект репорт в противном случае

Александр
25.10.2018
15:45:44
я и не говорю, что обязано не скомпилироваться, а как раз наоборот - оно никому ничем не обязано, это же UB!

Google

Constantine
25.10.2018
15:46:00

Александр
25.10.2018
15:46:22
а, мы говорим про constexpr версию

Constantine
25.10.2018
15:46:33
нет, просто компилируемость это constexpr проверяемо

Spoonson
25.10.2018
15:46:40
Тут надо в стандарте смотреть требуется ли чтоб UB было well formed

Constantine
25.10.2018
15:47:13
я могу ошибаться, но UB компилируемости начинается во время линковки, но никогда не в одном TU
т.е. до линковки это максимум implementation defined (скажем константы платформы проверяем)
т.е. невозможно, что "проверка наличия front() у array<int, 0> это UB"
либо есть, либо нет, либо implementation defined :)

Александр
25.10.2018
15:49:44
я запутался

Constantine
25.10.2018
15:50:31
ну смотри, метод класса в стандартной либе либо есть, либо нет, либо implementation defined
ответ на этот вопрос никогда не behavior of this check is undefined
так что std::array<int, 0>{}.front() либо компилируется, либо нет, либо компилируемость implementation defined

Александр
25.10.2018
15:52:02
это логично

Constantine
25.10.2018
15:52:26
и если что-то кроме "не компилируется", у меня в очередной раз подгорит)
это логично
ну... вот слинкуется или нет уже бывает behavior is undefined :)

Slava
25.10.2018
15:58:47
всем привет, кто-то работал с Media Foundation?
или с API DirectX/Direct3D

Vyacheslav
25.10.2018
16:03:57

Александр
25.10.2018
16:04:51

Vyacheslav
25.10.2018
16:05:19

Google

Constantine
25.10.2018
16:06:13
Alright
Да, я еще немного подумал про нашу дискуссию и мне стало интересно, насколько возможна формальная преобразования вашего стиля кода в мой (зачеркнуто, наоборот, моего в ваш)
Я возьму некоторый таймаут :)

Vyacheslav
25.10.2018
16:06:46

Александр
25.10.2018
16:07:16

Constantine
25.10.2018
16:07:29

Александр
25.10.2018
16:07:29
ну смотри, метод класса в стандартной либе либо есть, либо нет, либо implementation defined
Вроде бы всё-таки интерфейс std::array не зависит от N - все члены должны присутствовать: http://eel.is/c++draft/sequences#array.zero
Здесь указано, что должно работать при N == 0 и "эффект вызова front() или back() для array нулевого размера - undefined".
Эффект вызова - это значит, что, если во время выполнения вызовутся front/back - может быть всё, что угодно. Но код, содержащий потенциальные вызовы этих функций должен компилироваться (и линковаться, и запускаться).

Constantine
25.10.2018
16:08:03
Зато теперь есть переносимый __builtin_unreachable!
Хотя он и раньше был, int f() {}, но теперь с объектами

Nikita
25.10.2018
16:10:36
а чё если reference front() { return reinterpret_cast<reference>(*this); }
это у меня мысли, чё запихать то внутрь этой функции

Vyacheslav
25.10.2018
16:11:33

Constantine
25.10.2018
16:11:55

Nikita
25.10.2018
16:12:24

Vyacheslav
25.10.2018
16:12:25

Nikita
25.10.2018
16:12:54

Vyacheslav
25.10.2018
16:13:13
Кстати, а если объявить функцию, как noreturn ?

Constantine
25.10.2018
16:13:39
видимо, begin и end надо реализовать как this
data() надо реализовать как return nullptr
front() и back() надо реализовать как return *data()

Vyacheslav
25.10.2018
16:14:37

Constantine
25.10.2018
16:14:51
хотя можно front() и back() действительно [[noreturn]] и бросать исключение
или там требование noexcept для front()/back()?

Google

Александр
25.10.2018
16:15:39

Nikita
25.10.2018
16:16:36

Constantine
25.10.2018
16:16:44

Vyacheslav
25.10.2018
16:18:04

Александр
25.10.2018
16:18:09

Vyacheslav
25.10.2018
16:19:27

Александр
25.10.2018
16:19:51

Nikita
25.10.2018
16:22:00
Кстати, а *nullptr обязано компилиться?)
Раз уж такая пляска

Constantine
25.10.2018
16:23:43

Дед Пегас
25.10.2018
16:25:07

Nikita
25.10.2018
16:25:22

Александр
25.10.2018
16:25:33

Constantine
25.10.2018
16:28:03

Firstname
25.10.2018
16:29:16
ПОЦАНЫ КТО ЗНАЕТ БЕЙСИК????
без шуток где чат по бейсику?

Дед Пегас
25.10.2018
16:30:14
Нашёл, где спрашивать.

Vitaly
25.10.2018
16:31:10

Group Butler [beta]
25.10.2018
16:31:11
Firstname has been warned (1/3)

Constantine
25.10.2018
16:32:49