Зачем добавлять noexcept к функциям с constexpr?

118
13 сентября 2019, 17:50

В стандартной библиотеке MSVC 2017 поставляется примерно такая реализация std::size:

template<class T, size_t S>
constexpr size_t size(T(&)[S]) noexcept
{
    return S;
}

Действительно, стандарт не запрещает функциям constexpr бросать исключения, но здесь и функция тривиальная. Компилятор может и сам вычислить noexcept, в других случаях MSVC 2017 прекрасно это делает, например:

template<typename T>
constexpr auto Plus(T left, T right)
{
     return left + right;
}
static_assert(noexcept(Plus(1,3)), "fail"); // OK в MSVC 2017

Тогда зачем noexcept: просто так захотелось, так надо, или это ошибка?

Answer 1

Начиная с С++17 noexcept входит в тип функции, но при этом как и возвращаемый тип, не является частью сигнатуры. Поэтому и требуется явное указание, если нужно чтобы функция действительно считалась noexcept.

Например, данный код валиден только начиная с c++17:

void f() noexcept {}
int main()
{
    using P = void (*)() noexcept; // c++14 не позволяет тут `noexcept`
    P fp = &f;
}

Это позволяет в частности делать такое разделение:

void g() {} 
P fp = &f;
P gp = &g;  // ошибка из-за отсутствия `noexcept` у `g`

Наличие constexpr у функции не даёт каких-либо преференций считать её noexcept. Хотя до c++17 нечто подобное предполагалось при использовании оператора noexcept.

READ ALSO
Обработать wheelEvent в QtGraphicsView

Обработать wheelEvent в QtGraphicsView

Хочу реализовать масштабирование в QtGraphicsView через колесико мышиНа данный момент делаю это через фильтр событий следующим способом:

138
Как изменить позицию body в Box2D?

Как изменить позицию body в Box2D?

Мне нужно в один момент времени изменить позицию тела по заданным координатамТо есть летит тело и нужно его "телепортировать" на новую позицию

122
Как в Node.js использовать библиотеку С++?

Как в Node.js использовать библиотеку С++?

Есть (динамическая) библиотека C++ с таким содержимым:

162
Функция _gethe() [закрыт]

Функция _gethe() [закрыт]

Как используя функцию _getch() реализовать(задание с калькулятором из института): 1) вводим 1, потом 2, потом 3 и тд

136