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最终返回,则行为未定义.
没有提到返回类型.唯一重要的是功能不归.如果函数返回(无论是void或int或vector<vector<double>>),则行为是不确定的.如果函数没有返回,则返回类型并不重要.
101*_*010 10
从C++标准§7.6.8/ p2 Noreturn属性[dcl.attr.noreturn](Emphasis Mine):
如果调用函数f,其中f先前使用noreturn属性声明,并且f最终返回,则行为未定义.[注意:该函数可以通过抛出异常来终止. - 尾注] [注意:如果标记为[[noreturn]]的函数可能返回,则鼓励实现发出警告. - 结束说明]
因为你的功能永远不会到达return 0;那里没有UB.
| 归档时间: |
|
| 查看次数: |
1025 次 |
| 最近记录: |