Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是不是;“回报值优化”;导致未定义的行为?_C++_Return Value Optimization - Fatal编程技术网

C++ 是不是;“回报值优化”;导致未定义的行为?

C++ 是不是;“回报值优化”;导致未定义的行为?,c++,return-value-optimization,C++,Return Value Optimization,阅读维基百科的一篇文章,其中一位回答者指出了以下问题: 我遇到了这条线 根据编译器和编译器的设置,生成的程序可能会显示以下任何输出: 这不符合未定义行为的条件吗?我知道文章说的取决于编译器和设置,但我只想澄清这一点。否。该行为被定义为列表上的输出之一。未定义的行为包括从你鼻子里飞出来的恶魔 请参阅:与非常不同,这就是此处所涉及的。不,这不是未定义的行为。未定义的行为在标准中有一个特定的定义(主要是:“使用错误的程序构造或错误的数据时可能产生的行为,本国际标准对此没有规定要求。”)在这种情况下,

阅读维基百科的一篇文章,其中一位回答者指出了以下问题:

我遇到了这条线

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


这不符合未定义行为的条件吗?我知道文章说的
取决于编译器和设置
,但我只想澄清这一点。

否。该行为被定义为列表上的输出之一。未定义的行为包括从你鼻子里飞出来的恶魔


请参阅:

与非常不同,这就是此处所涉及的。

不,这不是未定义的行为。未定义的行为在标准中有一个特定的定义(主要是:“使用错误的程序构造或错误的数据时可能产生的行为,本国际标准对此没有规定要求。”)在这种情况下,行为是未指定的,但不是未定义的


不同之处在于,任何未定义行为的执行都会导致程序的所有行为未定义(即,任何事情都可能发生)。对于这种特殊的未指定行为,只能发生两种情况中的一种:复制构造函数要么执行,要么不执行。

取决于未定义的含义。我相信其他人在这里所说的——根据标准文件使用的定义。但我也知道,当有人说“要么这个,要么那个,我不是在告诉你哪个”时,我认为这是一种未定义的行为

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


在这种情况下,无论您获得的是复制构造等还是优化的行为,预期效果都是相同的-调用者收到想要的值。如果您的复制构造函数正在打印“Hello World!”或具有其他不适当的副作用,则它没有实现构造函数的预期行为,因此违约的责任在于您。

它没有真正定义实现——这需要实现记录所发生的情况,这在本例中不是必需的。有一个定义了的实现,其中编译器实现者必须记录行为,这里没有指定,这意味着只要“可观察的行为”保持不变,编译器就可以做任何它想做的事情。然后是未定义的行为,这意味着您已经在程序中进入了一个状态,在该状态下它的执行不再被定义。RVO是一种允许可观察行为改变的情况。我记得当我开始在未定义、未指定和实现定义之间切换时,我非常困惑。非常好且简洁的解释。+1用于说明由于这种优化可能会导致无法无声执行的副作用:)如果这是一条打印语句,您在终端上急切地关注它,那么您可以捕获它;而一些更安静的东西,比如说,在构造发生时将消息传递给另一个对象,将不会发生,而且很难捕获。因此,我可以由此推断,无论构造函数的类型如何(默认、复制等),除了初始化成员之外,我不应该做任何特定的事情?@legends2k:是的。该标准允许在从函数返回时省略复制构造函数调用,这意味着您的代码不应该试图依赖复制构造函数中的副作用。不正确。除了构造对象之外,它不应该做任何事情,这与构造对象不是一回事。例如,对象可能拥有某个外部容器中的数据,例如自定义分配。这种改变是否会产生副作用?严格地说是的,但在实践中,可能不是。然而,很难表达条件——主观上是关于将“什么”与“如何”分开,但如果应用程序允许用户报告/配置一些“如何”作为“什么”的一部分,这是可以的。是的,我想这绝对是可能的。部分。也许。清楚的