Size: a a a

2020 March 21

PZ

Pavel Zhigulin in pro.cxx
Antony Polukhin
Идея описана в самом конце: не применять P1656 "Throws: Nothing" should be noexcept до тех пор, пока не появятся концепты
Ок, ладно, прошу прощения. Прочёл оригинальный документ, в котором обсуждается в чём проблема.
В целом, тогда идею поддерживаю. Согласен, что noexcept многими (и даже мной, если честно), воспринимается как "ну точно не сломается, можно и у себя noexcept написать", поэтому делать функции, которые всё-таки нарушают narrow contract как noexcept - странная затея и я согласен с аргументом про самописные "STL".

Другое дело, что я по прежнему настаиваю на том, что в шаблонных классах/методах/функциях нужно запретить noexcept, т.к. поддержать Wide Contract в этом случае почти нереально и от излишне-оптимистичных noexcept страданий больше, чем от отсутствия оных.
источник

m

magras in pro.cxx
no name
совсем убирать нельзя. как вариант, добавить noexcept(auto)
Кстати, мне нравится идея noexcept(auto). Писать noexcept neutral код довольно неприятно без него.
источник

PZ

Pavel Zhigulin in pro.cxx
На самом деле noexcept(auto) не особо нужен. Нужно лишь, чтобы компилятор, если смог вывести noexcept возвращал true на это выражение:

static_assert( noexcept( std::declval< Foo<your_class> >().bar() ) )
источник

PZ

Pavel Zhigulin in pro.cxx
Потому что сейчас если Foo<T>::bar не помечена как noexcept - компилятор вернет false.
источник

N

Neargye in pro.cxx
Pavel Zhigulin
На самом деле noexcept(auto) не особо нужен. Нужно лишь, чтобы компилятор, если смог вывести noexcept возвращал true на это выражение:

static_assert( noexcept( std::declval< Foo<your_class> >().bar() ) )
Для лямбд noexcept(auto) было бы отлично
источник

PZ

Pavel Zhigulin in pro.cxx
Neargye
Для лямбд noexcept(auto) было бы отлично
Нужно чтобы noexcept(auto) было неявным, вот и всё.
источник

PZ

Pavel Zhigulin in pro.cxx
По крайней мере для шаблонных классов)
источник

PZ

Pavel Zhigulin in pro.cxx
Хотя конечно в качестве помощи компилятору... Ну, чтобы он анализировал выражения на noexcept только в помеченных функциях.
источник

N

Neargye in pro.cxx
Pavel Zhigulin
Нужно чтобы noexcept(auto) было неявным, вот и всё.
Мне кажется это ломает АБИ
источник

PZ

Pavel Zhigulin in pro.cxx
Так может оно и к лучшему? Если у нас был код, который на noexcept(auto) не порождал исключений, а потом вдруг начал - это же хорошо, что мы не сможем собраться - ведь мы избежим потенциального std::terminate)
источник

m

magras in pro.cxx
Pavel Zhigulin
Нужно чтобы noexcept(auto) было неявным, вот и всё.
Проблема в том, что noexcept - часть сигнатуры. Это не очень здорово когда по-умолчанию используется механизм меняющий сигнатуру в зависимости от тела функции. Поэтому мне больше нравится вариант с явной просьбой вывести noexcept для конкретной функции.
источник

N

Neargye in pro.cxx
Antony Polukhin
Народ, нужен фидбек на идею http://apolukhin.github.io/papers/Back%20to%20Throws%20Nothing.html

Буду рад любым коментариям и замечаниям.
Кстати да вопрос, разве добавление noexept во все места не ломает аби?
источник

PZ

Pavel Zhigulin in pro.cxx
magras
Проблема в том, что noexcept - часть сигнатуры. Это не очень здорово когда по-умолчанию используется механизм меняющий сигнатуру в зависимости от тела функции. Поэтому мне больше нравится вариант с явной просьбой вывести noexcept для конкретной функции.
Ок, аргумент)
источник

ПК

Побитый Кирпич in pro.cxx
Antony Polukhin
Иначе - концепты теряют часть смысла, корпоративные стандартные библиотеки перестают удовлетворять стандатту, мы поощряем плохие практики и провоцируем баги
Имел ввиду контракты, да?
источник

ПК

Побитый Кирпич in pro.cxx
Pavel Zhigulin
Ок, ладно, прошу прощения. Прочёл оригинальный документ, в котором обсуждается в чём проблема.
В целом, тогда идею поддерживаю. Согласен, что noexcept многими (и даже мной, если честно), воспринимается как "ну точно не сломается, можно и у себя noexcept написать", поэтому делать функции, которые всё-таки нарушают narrow contract как noexcept - странная затея и я согласен с аргументом про самописные "STL".

Другое дело, что я по прежнему настаиваю на том, что в шаблонных классах/методах/функциях нужно запретить noexcept, т.к. поддержать Wide Contract в этом случае почти нереально и от излишне-оптимистичных noexcept страданий больше, чем от отсутствия оных.
В каких то шаблонах можно вывести Noexcept
источник

AP

Antony Polukhin in pro.cxx
Побитый Кирпич
Имел ввиду контракты, да?
чорт. Да, контракты
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Народ, нужен фидбек на идею http://apolukhin.github.io/papers/Back%20to%20Throws%20Nothing.html

Буду рад любым коментариям и замечаниям.
Если вопрос о том, считать ли что noexcept это "эта функция не UBает и не бросает исключения при любых аргументах" или "эта функция не бросает исключение", я определенно за второй вариант (то есть за P1656)
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
Если вопрос о том, считать ли что noexcept это "эта функция не UBает и не бросает исключения при любых аргументах" или "эта функция не бросает исключение", я определенно за второй вариант (то есть за P1656)
А почему?
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
А почему?
Потому что первый класс функций настолько узкий, что непонятно, как его маркировать, если считать this аргументом функции. vector::empty() все-таки UBает по битым ссылкам
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
Потому что первый класс функций настолько узкий, что непонятно, как его маркировать, если считать this аргументом функции. vector::empty() все-таки UBает по битым ссылкам
Хм... Это хороший аргумент
источник