noreturn是函数签名的一部分吗?可以检测到吗?

alf*_*lfC 9 c++ generic-programming c++11 noreturn

[dcl.attr.noreturn]可用于标记函数不返回.

[[ noreturn ]] void f() {
    throw "error";
}
Run Code Online (Sandbox Code Playgroud)

[[noreturn]]功能的身份/签名的一部分?可以noreturn在编译时检测到某个函数吗?

例如,

static_assert(is_noreturn(f));
Run Code Online (Sandbox Code Playgroud)

如果不是,我应该采用约定来定义标签结构吗?

struct noreturn_{noreturn_()=delete;};
...
[[noreturn]] noreturn_ f(){throw "error";}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 8

"签名"有一个非常精确的定义.好吧,有几个,取决于你所说的事情:

  • ⟨function⟩名称,参数类型列表([dcl.fct]),包围命名空间(如果有的话),和尾需要子句([dcl.decl])(如果有的话)
  • ⟨functiontemplate⟩名称,参数类型列表([dcl.fct]),包围命名空间(如果有的话),返回类型,模板头部和尾部需要子句([dcl.decl])(如果有的话)
  • ⟨functiontemplatespecialization⟩模板的签名,它是一个特化及其模板参数(无论是明确指定还是推导)
  • ⟨class构件function⟩名称,参数类型列表([dcl.fct]),类的功能是一个构件,cv修饰符(如果有的话), REF-限定符(如果有的话),和尾需要子句([ dcl.decl])(如果有的话)
  • ⟨class成员函数template⟩名称,参数类型列表([dcl.fct]),类的功能是一个构件,cv修饰符(如果有的话),REF-限定符(如果有的话),返回类型(如果有的话) ,template-head和trailing requires-clause([dcl.decl])(如果有的话)
  • ⟨class成员函数模板specialization⟩成员函数模板的签名,它是一个特化及其模板参数(无论是明确指定还是推导)

属性不属于任何属性.

[[noreturn]]也不属于该类型.它与功能有关,而不是它的类型.


可以在编译时检测到函数是否正在编译?

第委员会设立的属性的规则是"编译与忽略必然导致原计划的正确解释特定属性的所有实例的有效方案".如果您可以以编程方式检测属性的存在,那么该规则就不会成立.


如果不是,我应该采用一个约定,[d]定义一个标签结构?

目前还不清楚这样的标签会有什么用处.


PSk*_*cik 5

如果它是类型的一部分,正确的类型检查编译器将不会接受例如:

[[noreturn]] int f(void);
int (*fp)(void) = f;
Run Code Online (Sandbox Code Playgroud)

以上编译没有错误. [[noreturn]]不属于该类型.(顺便说一下,它们都不_Noreturn在C11中,它在语法上被放置在同一类别中inline).

至于检测它,我在C++ 11标准草案中找不到任何机制.像你提议的那样的约定可以允许你检测它,但你只能遵循遵循这种约定的函数.