cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Тривиальные inline геттеры должны быть автоматически noexcept #348

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +2, -1 Автор идеи: Konstantin Stupnik

Собственно для кода типа:

class Foo{
public:
  int bar()const
  {
    return m_bar;
  }

private:
  int m_bar;
};

оператор noexcept вернёт для bar() false, когда у компилятора есть всё, что бы понять, что этот метод никогда не может кинуть исключение.

apolukhin commented 3 years ago

yndx-antoshkka, 31 августа 2018, 13:16 Это не очень сложно сделать - надо исправить вот эту главу eel.is/c++draft/except.spec . Стоит туда добавить что-то наподобие "При дефиниции невиртуальной функции члена класса внутри класса и отсутствии спецификатора noexcept спецификатор noexcept(noexcept(statements) && ...) добавляется автоматически".

Есть пара страшных моментов - времена компиляции и бинарная совместимость. С C++17 noexcept является частью сигнатуры функции, так что если начать выводить его автоматически - то пользовательский код перестанет линковаться. Возможно стоит дополнительно ограничить, что noexcept выводится только для имён с internal linkage http://eel.is/c++draft/basic.link

Попробуйте накидать diff/правок для стандарта. Свои правки и идеи скидывайте мне - обещаю смотреть и помогать советом и делом. Как проработаем мелочи - можно будет закинуть письмо в std-proposal форум, а потом и полноценный proposal сделать.

Andrey Davydov, 31 августа 2018, 13:39 yndx-antoshkka, в данный момент нет noexcept(statement) только noexcept(expression). А statement'ов много разных, надо для каждого при таком подходе определить noexcept.

Андрей Руссков, 28 сентября 2018, 0:19 yndx-antoshkka, по идее можно же сделать неявный noexcept(auto) для всех inline функций, включая определенные в теле класса методы? Просто надо будет заодно указать в стандарте (если это еще не сделано) что inline foo(); и inline foo() noexcept; в разных TU никогда не конфликтуют