[Dcl.attr.noreturn] может использоваться, чтобы отметить, что функция не возвращается.
[[ noreturn ]] void f() {
throw "error";
}
Является [[noreturn]]
часть личности / подписи функции? Можно ли обнаружить, что функция noreturn
во время компиляции?
Например,
static_assert(is_noreturn(f));
В случае, если это не так, я должен принять соглашение определить структуру тега?
struct noreturn_{noreturn_()=delete;};
...
[[noreturn]] noreturn_ f(){throw "error";}
«подпись» имеет очень точное определение. Что ж, несколько, в зависимости от того, о чем вы говорите:
- Имя «функции», список типов параметров ([dcl.fct]), включающее пространство имен (если есть) и завершающий требует придаточного ([dcl.decl]) (если есть)
- Имя «шаблона функции», список типов параметров ([dcl.fct]), включающее пространство имен (если есть), тип возвращаемого значения, шаблон головки, и тянущийся требует придаточного ([dcl.decl]) (если есть)
- «Специализация шаблона функции» сигнатура шаблона, специализацией которого он является, и аргументы шаблона (явно ли они указаны или выведены)
- Имя «функции-члена класса», список типов параметров ([dcl.fct]), класс, членом которого является функция, CV-классификаторы (если есть), реф-классификатор (если есть) и трейлинг требует придаточного ([dcl.decl]) (если есть)
- Имя шаблона функции-члена класса, список типов параметров ([dcl.fct]), класс которого
функция является членом, CV-классификаторы (если есть), реф-классификатор (если есть), вернуть
тип (если есть), шаблон головки, и тянущийся требует придаточного ([dcl.decl]) (если есть)- «Специализация шаблона функции-члена класса» подпись шаблона функции-члена, специализацией которого он является
аргументы шаблона (явно ли они указаны или выведены)
Атрибутов нет ни в одном из них.
[[noreturn]]
также не является частью типа. Это относится к функции, а не к ее типу.
Можно ли обнаружить, что функция не возвращается во время компиляции?
Нет. Правило, установленное комитетом для атрибутов, заключается в том, что «компиляция действительной программы с игнорированием всех экземпляров определенного атрибута должна приводить к правильной интерпретации исходной программы». Это правило не будет выполняться, если вы сможете программно определять наличие атрибута.
Если это не так, я должен принять соглашение и [d] определить структуру тега?
Непонятно, как использовать такой тег.
Если бы это было частью типа, компилятор с проверкой типов не принял бы
например, что-то вроде:
[[noreturn]] int f(void);
int (*fp)(void) = f;
Вышеуказанное компилируется без ошибок.
[[noreturn]]
не является частью типа. (Кстати, ни _Noreturn
в C11, где он находится синтаксически в той же категории, что и inline
).
Что касается его обнаружения, я не нашел никакого механизма для этого в проекте стандарта C ++ 11. Соглашение, такое как предложенное вами, может позволить вам обнаружить его, но вы будете ограничены функциями, которые следуют этому соглашению.