Является ли noreturn частью подписи функции? Может быть обнаружено?

[Dcl.attr.noreturn] может использоваться, чтобы отметить, что функция не возвращается.

[[ noreturn ]] void f() {
throw "error";
}

Является [[noreturn]] часть личности / подписи функции? Можно ли обнаружить, что функция noreturn во время компиляции?

Например,

static_assert(is_noreturn(f));

В случае, если это не так, я должен принять соглашение определить структуру тега?

struct noreturn_{noreturn_()=delete;};
...
[[noreturn]] noreturn_ f(){throw "error";}

8

Решение

«подпись» имеет очень точное определение. Что ж, несколько, в зависимости от того, о чем вы говорите:

  • Имя «функции», список типов параметров ([dcl.fct]), включающее пространство имен (если есть) и завершающий требует придаточного ([dcl.decl]) (если есть)
  • Имя «шаблона функции», список типов параметров ([dcl.fct]), включающее пространство имен (если есть), тип возвращаемого значения, шаблон головки, и тянущийся требует придаточного ([dcl.decl]) (если есть)
  • «Специализация шаблона функции» сигнатура шаблона, специализацией которого он является, и аргументы шаблона (явно ли они указаны или выведены)
  • Имя «функции-члена класса», список типов параметров ([dcl.fct]), класс, членом которого является функция, CV-классификаторы (если есть), реф-классификатор (если есть) и трейлинг требует придаточного ([dcl.decl]) (если есть)
  • Имя шаблона функции-члена класса, список типов параметров ([dcl.fct]), класс которого
    функция является членом, CV-классификаторы (если есть), реф-классификатор (если есть), вернуть
    тип (если есть), шаблон головки, и тянущийся требует придаточного ([dcl.decl]) (если есть)
  • «Специализация шаблона функции-члена класса» подпись шаблона функции-члена, специализацией которого он является
    аргументы шаблона (явно ли они указаны или выведены)

Атрибутов нет ни в одном из них.

[[noreturn]] также не является частью типа. Это относится к функции, а не к ее типу.


Можно ли обнаружить, что функция не возвращается во время компиляции?

Нет. Правило, установленное комитетом для атрибутов, заключается в том, что «компиляция действительной программы с игнорированием всех экземпляров определенного атрибута должна приводить к правильной интерпретации исходной программы». Это правило не будет выполняться, если вы сможете программно определять наличие атрибута.


Если это не так, я должен принять соглашение и [d] определить структуру тега?

Непонятно, как использовать такой тег.

8

Другие решения

Если бы это было частью типа, компилятор с проверкой типов не принял бы
например, что-то вроде:

[[noreturn]] int f(void);
int (*fp)(void) = f;

Вышеуказанное компилируется без ошибок.
[[noreturn]] не является частью типа. (Кстати, ни _Noreturn в C11, где он находится синтаксически в той же категории, что и inline).

Что касается его обнаружения, я не нашел никакого механизма для этого в проекте стандарта C ++ 11. Соглашение, такое как предложенное вами, может позволить вам обнаружить его, но вы будете ограничены функциями, которые следуют этому соглашению.

5

По вопросам рекламы [email protected]