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

Tre*_*key 18 c++ return undefined-behavior c++11 noreturn

我之前从未见过[[noreturn]]用于非void返回函数.

以下是否定义明确?

[[ noreturn ]] int function();

int function(){
  while(true){/* impl */}
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

返回类型必须是的原因int是因为函数通过函数指针传递给另一个函数.

所以假设调用者看起来像这样:

//call the non-returning function
int var = (*fptr)();

//use var some way (even though the function will never actually return)
std::cout << var;
Run Code Online (Sandbox Code Playgroud)

这会表现出任何未定义的行为吗?

Bar*_*rry 24

标准规范[[noreturn]]在[dcl.attr.noreturn]中.整个规范性文本如下:

属性令牌 noreturn指定函数不返回.它应该在每个属性列表中最多出现一次,并且不存在attribute-argument-clause.该属性可以应用于函数声明中的declarator-id.noreturn 如果该函数的任何声明指定了该属性,则函数的第一个声明应指定该noreturn属性.如果noreturn在一个翻译单元中声明了具有该属性的函数,并且noreturn 在另一个翻译单元中声明了没有该属性的相同函数,则该程序是不正确的; 无需诊断.

如果f调用函数f先前使用该noreturn属性声明并f最终返回,则行为未定义.

没有提到返回类型.唯一重要的是功能不归.如果函数返回(无论是voidintvector<vector<double>>),则行为是不确定的.如果函数没有返回,则返回类型并不重要.


101*_*010 10

从C++标准§7.6.8/ p2 Noreturn属性[dcl.attr.noreturn](Emphasis Mine):

如果调用函数f,其中f先前使用noreturn属性声明,并且f最终返回,则行为未定义.[注意:该函数可以通过抛出异常来终止. - 尾注] [注意:如果标记为[[noreturn]]的函数可能返回,则鼓励实现发出警告. - 结束说明]

因为你的功能永远不会到达return 0;那里没有UB.

  • 这是如何回答这个问题的?OP知道它不应该返回,他在询问它的类型. (5认同)