Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在非void返回函数上使用[[noreturn]]吗?_C++_C++11_Return_Undefined Behavior_Noreturn - Fatal编程技术网

C++ 我可以在非void返回函数上使用[[noreturn]]吗?

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

我以前从未见过在非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 the function will never actually return)
std::cout << var;
//调用非返回函数
int var=(*fptr)();
//以某种方式使用var(即使函数永远不会实际返回)

std::cout关于
[[noreturn]]
的标准规范在[dcl.attr.noreturn]中。整个规范性案文如下:

属性token
noreturn
指定函数不返回。它最多在一个月内出现一次 应提供每个属性列表和无属性参数条款。该属性可以应用于 函数声明中的声明器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它永远不会到达那一行。