“返回值优化”是否会导致未定义的行为?

时间:2010-02-24 05:42:31

标签: c++ return-value-optimization

阅读以下问题的一位回复者指出的this维基百科文章:

C++ Copy constructor, temporaries and copy semantics

我遇到过这一行

  

根据编译器和编译器的设置,生成的程序可能会显示以下任何输出:

这不符合未定义的行为吗?我知道这篇文章是Depending on the compiler and settings,但我只想清楚这一点。

4 个答案:

答案 0 :(得分:12)

不,这不是未定义的行为。未定义的行为在标准中有一个特定的定义(主要是:“行为,例如在使用错误的程序结构时可能出现的行为或错误的数据,本国际标准不对其施加任何要求。”)在这种情况下,行为未指定,但并非未定义。

不同之处在于,任何具有未定义行为的行为的执行都会使程序的所有行为都未定义(即任何事情都可能发生)。使用这种特定的未指定行为时,只会发生以下两种情况之一:复制构造函数执行,或者不执行。

答案 1 :(得分:2)

没有。该行为被定义为列表中的输出之一。未定义的行为包括恶魔飞出你的鼻子。

请参阅:Nasal Demons

答案 2 :(得分:1)

undefined behaviorimplementation defined behavior完全不同,这是此处涉及的内容。

答案 3 :(得分:0)

取决于undefined的意思。我相信其他人在这里所说的 - 按标准文件使用的定义。但我也知道,当有人说“无论是这个还是那个,我都不会告诉你哪个”我认为它是未定义的行为。

但是,这不是什么大问题,因为它永远不会导致错误。当您定义某些方法时,您需要按照特定约定定义它们 - 它是您,编译器以及将使用和维护代码的人之间的一种隐式契约。

在这种情况下,无论是获得复制构造等还是优化行为,预期效果都是相同的 - 调用者会收到所需的值。如果您的复制构造函数正在打印“Hello World!”或者有其他不适当的副作用,它没有实现构造函数的预期行为,所以错误是你的破坏合同。