这个C ++ 11语法意味着什么?
[[ noreturn ]] void f () {
throw "error";
}
C ++标准工作草案n3797声明,
函数的第一个声明应指定noreturn 如果该函数的任何声明指定了noreturn属性 属性。如果声明了一个带有
noreturn
属性的函数 一个翻译单元和相同的函数声明没有 noreturn属性在另一个翻译单元中,程序是 形成不良;无需诊断。
函数的属性是什么意思?
答案 0 :(得分:4)
函数由其名称,返回类型以及形式参数列表及其类型定义。这些项构成了函数的“接口”:它们对函数的调用者很重要,因为它们定义了调用函数的方式。
另一方面,属性提供了一种方法来告诉编译器有关不改变其接口的函数的其他内容。当编译器知道函数是
时fork
)或编译器可以更好地优化代码,并提供额外的警告/静音不必要的警告。
例如,如果你写
main() {
f();
g();
}
且f()
标记为noreturn
,编译器将发出有关g()
无法访问的调用的警告。
答案 1 :(得分:4)
属性是C ++ 11中的新功能。编译器供应商长期以来一直提供特定于供应商的扩展,允许您以某种方式注释函数,但现在有一种标准机制。标准没有指定许多实际属性(仅noreturn
和carries_dependency
),但注释函数的机制至少已标准化。
也就是说,noreturn
属性具有非平凡的语义:如果使用此属性声明的函数确实返回,则程序具有未定义的行为。编译器应该(但不必)产生诊断,如果他们可以告诉你从noreturn函数返回。该属性对于优化和更好的诊断非常有用。
答案 2 :(得分:2)
[[noreturn]]
属性用于静音警告。
#include <stdexcept>
[[noreturn]] void report_error()
{
throw std::runtime_error("error");
}
int f(int x)
{
if (x > 0) {
return x;
}
report_error();
}
int main()
{
f(1);
}
如果没有使用[[noreturn]]
,则f()
中的编译器输出警告:warning: control may reach end of non-void function
。
答案 3 :(得分:1)
来自GCC的文档 “ noreturn关键字告诉编译器假定函数不能返回。然后它可以进行优化,而不考虑如果致命的事情会再次发生会发生什么。这使得代码略胜一筹。更重要的是,它有助于避免未初始化变量的虚假警告。“