C++ 如果一个noreturn函数返回时调用了另一个noreturn函数,那么它返回的行为是否未定义?

C++ 如果一个noreturn函数返回时调用了另一个noreturn函数,那么它返回的行为是否未定义?,c++,undefined-behavior,noreturn,C++,Undefined Behavior,Noreturn,假设我正在制作一个应用程序,它将持续很长时间,并且不会因为任何正常原因而终止(例如,用户终止应用程序,例如:HTTP服务器) 我用C++11标准属性[[noreturn]]标记main本身,表示它必须在不中止或引发异常的情况下将控制权返回给被调用方 [[noreturn]]int main( int const argc, 字符常量*常量[]argv ) { ... } 我首先解析CLI参数,然后将提取的数据传递到我的“real”主函数中,在这里继续更多的工作 另一个函数,我们称之为realM

假设我正在制作一个应用程序,它将持续很长时间,并且不会因为任何正常原因而终止(例如,用户终止应用程序,例如:HTTP服务器)

我用C++11标准属性
[[noreturn]]
标记
main
本身,表示它必须在不中止或引发异常的情况下将控制权返回给被调用方

[[noreturn]]int main(
int const argc,
字符常量*常量[]argv
) { ... }
我首先解析CLI参数,然后将提取的数据传递到我的“real”主函数中,在这里继续更多的工作

另一个函数,我们称之为
realMain
,也被标记为
[[noreturn]]]

在我的代码中,我给了
main
函数一个进入
realMain
的return语句,并立即收到关于从noreturn函数返回的一般提示

[[noreturn]]int realMain(数据常量数据){
...
标准:cerr

(强调矿山)

解释

指示函数不返回

此属性仅适用于在函数声明中声明的函数名。如果具有此属性的函数实际返回,则行为未定义。

如果有任何声明指定此属性,则函数的第一个声明必须指定此属性。如果在一个翻译单元中用[[noreturn]]声明函数,而在另一个翻译单元中用[[noreturn]]声明同一函数,则程序格式不正确;无需诊断


这是未定义的行为。如C++标准中所规定的:

9.12.9 Noreturn属性[dcl.attr.Noreturn]

如果调用函数f,其中f先前是用 noreturn属性和f最终返回时,行为为 未定义

函数是否通过返回另一个
[[noreturn]]
-属性函数的结果来返回并不重要

返回到其他noreturn函数是否安全,或者这种未定义的行为是否安全

我想知道这里是否有一些语言混乱

我不确定您的意思是
main()

无论如何,根据Casey链接到的示例:

void q [[ noreturn ]] (int i) {
  // behavior is undefined if called with an argument <= 0
  if (i > 0) {
    throw "positive";
  }
}
void q[[noreturn]](int i){
//如果使用参数0调用,则行为未定义{
抛出“肯定”;
}
}
我会理解,仅仅在
main()
中使用
return realMain();
并不是UB。如果
realMain()
实际返回,它只是UB。到那时,无论
main()
做什么,它都已经是UB了,因为
realMain()
首先违反了“诺雷图恩”承诺


但是,既然这两个函数都不应该返回,我不明白您为什么在任何情况下都要编写
return
,而不是将调用
realMain()
作为
main()的最后一条语句
,不返回。

@Casey希望改进标题,只要它不会完全改变问题。@ilkkachu
main
是返回的函数,
realMain
在读取程序正文结尾之前中止或退出程序。你能澄清一下你说“是”时所指的语句吗?提前谢谢。引文来自何处?@JadenGarcia引文的粗体部分。@chux“是”是指向源的链接:我对这个答案感到困惑。这个答案表明它不是未定义的行为。因为另一个noreturn函数永远不会返回(根据您引用的部分)然后,除非NoeTurn函数返回,否则不返回的函数也不会返回。C++标准定义调用和返回的顺序(或者不指定它),以这样的方式,函数可能会在
realMain
返回之前返回?可能会出现这样的情况:函数的最后一个操作是通过传入的函数指针进行尾部调用,它有时会从[[noreturn]接收指向返回函数的指针,有时会接收指向不返回的函数的指针从另一个角度来看,重要的是是否存在导致控件返回到[[noreturn]]函数调用方的事件序列。