阅读以下问题的一位回复者指出的this维基百科文章:
C++ Copy constructor, temporaries and copy semantics
我遇到过这一行
根据编译器和编译器的设置,生成的程序可能会显示以下任何输出:
这不符合未定义的行为吗?我知道这篇文章是Depending on the compiler and settings
,但我只想清楚这一点。
答案 0 :(得分:12)
不,这不是未定义的行为。未定义的行为在标准中有一个特定的定义(主要是:“行为,例如在使用错误的程序结构时可能出现的行为或错误的数据,本国际标准不对其施加任何要求。”)在这种情况下,行为未指定,但并非未定义。
不同之处在于,任何具有未定义行为的行为的执行都会使程序的所有行为都未定义(即任何事情都可能发生)。使用这种特定的未指定行为时,只会发生以下两种情况之一:复制构造函数执行,或者不执行。
答案 1 :(得分:2)
没有。该行为被定义为列表中的输出之一。未定义的行为包括恶魔飞出你的鼻子。
请参阅:Nasal Demons
答案 2 :(得分:1)
undefined behavior与implementation defined behavior完全不同,这是此处涉及的内容。
答案 3 :(得分:0)
取决于undefined的意思。我相信其他人在这里所说的 - 按标准文件使用的定义。但我也知道,当有人说“无论是这个还是那个,我都不会告诉你哪个”我认为它是未定义的行为。
但是,这不是什么大问题,因为它永远不会导致错误。当您定义某些方法时,您需要按照特定约定定义它们 - 它是您,编译器以及将使用和维护代码的人之间的一种隐式契约。在这种情况下,无论是获得复制构造等还是优化行为,预期效果都是相同的 - 调用者会收到所需的值。如果您的复制构造函数正在打印“Hello World!”或者有其他不适当的副作用,它没有实现构造函数的预期行为,所以错误是你的破坏合同。