Спецификация исключений в «typedef» полностью запрещена или только на верхнем уровне? - PullRequest
0 голосов
/ 29 января 2019

В C ++ 14 Sec 15.4; 2 указано, что ... Спецификация исключения не должна появляться в объявлении typedef или объявлении псевдонима.

Это означает, что запрещено следующее:

typedef void (*fn)(int) noexcept;

Но разве формулировка не должна появляться означает, что маркер noexcept не может появиться где-либо в объявлении typedef?

Например, они оба запрещены какхорошо?

typedef void (*fn1)(void (*)(int) noexcept);
typedef decltype(std::declval<void (*)(int)noexcept>()) fn2;

Они оба пытаются определить тип fn1 и fn2, способный указывать на функцию, которая берет указатель на функцию, принимающую int и ничего не возвращающую, обещаяникогда не выбрасывать исключение.

Так что в моих примерах спецификация исключений не применяется к типу верхнего уровня fn1 соотв.fn2, которые вводятся typedef, но к параметрам, которые может получить эта функция.

Так что мне взять 15.4; 2 дословно и поэтому оба моих примера неверны?Или запрещено только применение определения типа и мои примеры верны?

1 Ответ

0 голосов
/ 29 января 2019

Это все.

Цитирование полной формулировки [except.spec]/p2 из C ++ 11 и C ++ 14:

Спецификация исключений должен появляться только в объявителе функции для типа функции, указателя на тип функции, ссылки на тип функции или указателя на тип функции-члена, который является типом верхнего уровня объявления или определения, или для такого типа, который отображается какпараметр или тип возврата в деклараторе функции. спецификация исключений не должна появляться в объявлении typedef или объявлении псевдонима .

Возможно, это не совсем понятно, но я думаю, что этого достаточно: вы можете использовать спецификацию исключений в объявлении функции, в том числе в параметре или типе возврата в объявлении функции ... но не в псевдонимеобъявление.

Эта формулировка была полностью удалена в C ++ 17;noexcept теперь является частью системы типов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...