В 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 дословно и поэтому оба моих примера неверны?Или запрещено только применение определения типа и мои примеры верны?