@ProCxx

Страница 2470 из 2477
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:44:21
Да, в вашем примере максималное количество ссылок на объект = 1
Да это все эмулируется, там же можно простейшую умножалку этих ссылок реализовать

Alexander
25.10.2018
14:44:25
Почему не допускается? UB на то и UB, что может приводить к чему угодно
Я исхожу из того, что программа с UB это валидная синтаксически программа. А такую программу компилятор должен собирать

Constantine
25.10.2018
14:44:43
Да, в вашем примере максималное количество ссылок на объект = 1
По сути вы получаете одну ссылку и потом делаете ваш любимый shared_ptr

Смысл не в том, что возвращается, а в том, что отдавший объект может потребовать прекратить его использовать

Это строгие гарантии времени смерти, которые безумно важны для непроверяемых ссылок

Заметьте, что я там [this] замыкаю без всяких проверок, потому что у меня есть такие гарантии

В итоге через весь гуй во всех callback-ах этот this замыкается через макрос только ради дебажной проверки что все соблюдают правила

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

Constantine
25.10.2018
15:07:53
Замечу, что с файлом и сетевым соединением я обычно веду работу через методы обрамляющего класса B, а не напрямую обращаясь к A
Это эквивалентно UserThatAlwaysHasB, класс BUser из примера это класс, в который ресурс инжектается, но которому он не обязателен

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

Google
Constantine
25.10.2018
15:11:58
Замечу, что с файлом и сетевым соединением я обычно веду работу через методы обрамляющего класса B, а не напрямую обращаясь к A
must_have_b_user_view (по какой бы причине он не оказался вне В) получит просто прямую ссылку в конструктор, потому что в системе с императивами времени жизни очень легко обеспечивать предписания "давайте-ка я не переживу внешний объект"

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
тогда уж сразу *(int*)nullptr = 0;
это дает варнинги

как можно надеяться на UB?
так вызов __builtin_unreachable это как раз UB

Александр
25.10.2018
15:41:40
так вызов __builtin_unreachable это как раз UB
я про то, что нельзя давать гарантии, что оно не скомпилируется

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
Александр
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
тогда уж сразу *(int*)nullptr = 0;
Стреляйте в ногу поездами аэрофлота

Александр
25.10.2018
16:04:51
Стреляйте в ногу поездами аэрофлота
между прочим, это ровно то, во что превращается std::array<int, 0>{}.front() в реализациях libstdc++/libc++

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
А если этот метод вообще убрать из специализации для 0 ?
Я не знаю, почему это не сделано, если это не сделано

Александр
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 - может быть всё, что угодно. Но код, содержащий потенциальные вызовы этих функций должен компилироваться (и линковаться, и запускаться).

Nikita
25.10.2018
16:10:36
а чё если reference front() { return reinterpret_cast<reference>(*this); }

это у меня мысли, чё запихать то внутрь этой функции

Vyacheslav
25.10.2018
16:11:33
а чё если reference front() { return reinterpret_cast<reference>(*this); }
Можно объявлять конкурс на лучшее прикрытие костыля в стандарте

Constantine
25.10.2018
16:11:55
а чё если reference front() { return reinterpret_cast<reference>(*this); }
а ты там реализацию для MSC пишешь? :)

Nikita
25.10.2018
16:12:24
а ты там реализацию для MSC пишешь? :)
Ну вообще хочу переносимую, но тестирую под MSVC, да А как угадал?)

Vyacheslav
25.10.2018
16:12:25
Nikita
25.10.2018
16:12:54
bit_cast ещё можно :)
Мне под C++03 имлементацию надо

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
Мне под C++03 имлементацию надо
Можно статическую переменную указанного типа объявить в шаблоне в c++03?

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

или там требование noexcept для front()/back()?

Google
Александр
25.10.2018
16:15:39
А если этот метод вообще убрать из специализации для 0 ?
На всякий случай, приведу пример почему это нельзя убирать и почему это совсем не глупость: https://godbolt.org/z/NR_TRP

Nikita
25.10.2018
16:16:36
видимо, begin и end надо реализовать как this data() надо реализовать как return nullptr front() и back() надо реализовать как return *data()
а вдруг компилятор умный и он догадается что там nullptr разыменовывают и кинет ошибку компиляции

Александр
25.10.2018
16:18:09
Это проблема индейца, если size(container) известен в constexpr
Это пример программы не содержащей UB, которая должна компилироваться, запускаться и работать в правильной реализации языка.

Александр
25.10.2018
16:19:51
Nikita
25.10.2018
16:22:00
Кстати, а *nullptr обязано компилиться?)

Раз уж такая пляска

Дед Пегас
25.10.2018
16:25:07
Nikita
25.10.2018
16:25:22
Нет.
Оке, пасиб

Александр
25.10.2018
16:25:33
Кстати, а *nullptr обязано компилиться?)
у nullptr_t нет этого оператора. Так что нет.

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)

Страница 2470 из 2477