C++ 我可以在非void返回函数上使用[[noreturn]]吗?
我以前从未见过在非void返回函数上使用 以下定义是否明确C++ 我可以在非void返回函数上使用[[noreturn]]吗?,c++,c++11,return,undefined-behavior,noreturn,C++,C++11,Return,Undefined Behavior,Noreturn,我以前从未见过在非void返回函数上使用 以下定义是否明确 [[ noreturn ]] int function(); int function(){ while(true){/* impl */} return 0; } 返回类型必须为int,原因是函数通过函数指针传递给另一个函数 假设调用方看起来像这样: //call the non-returning function int var = (*fptr)(); //use var some way (even though
[[ noreturn ]] int function();
int function(){
while(true){/* impl */}
return 0;
}
返回类型必须为int
,原因是函数通过函数指针传递给另一个函数
假设调用方看起来像这样:
//call the non-returning function
int var = (*fptr)();
//use var some way (even though the function will never actually return)
std::cout << var;
//调用非返回函数
int var=(*fptr)();
//以某种方式使用var(即使函数永远不会实际返回)
std::cout关于[[noreturn]]
的标准规范在[dcl.attr.noreturn]中。整个规范性案文如下:
属性tokennoreturn
指定函数不返回。它最多在一个月内出现一次
应提供每个属性列表和无属性参数条款。该属性可以应用于
函数声明中的声明器id。函数的第一个声明应指定noreturn
属性,如果该函数的任何声明指定了noreturn
属性。如果函数是用
一个翻译单元中的noreturn
属性,在没有noreturn
属性,则程序格式不正确;无需诊断
如果调用函数f
,其中先前使用noreturn
属性声明了f
,并且f
最终返回,
该行为未定义
没有提到返回类型。唯一重要的是函数不能返回。如果函数返回(无论是void
还是int
还是vector
),则行为未定义。如果函数不返回,返回类型不重要。 从C++标准7.7.8/p2 NORITURN属性[DCL,At.NordeURN ](<强>强调矿山< /强>):
如果调用函数f,其中f先前是用
noreturn属性和f最终返回时,行为为
未定义。[注意:函数可能会通过抛出
例外情况。-结束说明][注:鼓励实施
如果标记为[[noreturn]]的函数可能返回,则发出警告。-结束
注]
因为你的函数永远不会到达返回0代码>并没有UB。若允许实现假设无限循环结束,您可能会遇到学究式的麻烦。()@chris我也希望用[[maybe_unused]]标记返回值。从你发布的链接来看:如果具有此属性的函数实际返回,则行为是未定义的。这如何回答问题?OP知道它不应该返回,他在询问它的类型。标准引用如何澄清它是ub?OP的函数最终不会返回。@Barry不会返回0
?@101010它永远不会到达那一行。