c++ - 为什么复制省略是假设规则的异常(exception)?

标签 c++ copy-elision as-if

为什么标准允许我的编译器应用复制省略,即使它涉及可见的副作用,从而打破了假设规则?

当有人保证复制省略时,这对我来说有点似是而非,因为复制/移动的实际功能(这将调用程序行为中的可见变化)不一定必须存在,但为什么/这是怎么回事在 C++17 之前?

是不是因为编译器一般不能检测到副作用(我不知道这是否可能)?

最佳答案

允许这种优化的情况涉及临时拷贝。从概念上讲,这些应该没有明显的效果,但该语言允许类编写者将他们想要的任何内容放入复制构造函数中。

因此,复制构造函数有时实际上可能会产生可见的副作用。严格来说,假设规则可能不适用。

人们认为这种优化非常有用,而且危害很小,值得包含在语言中。考虑到这种优化早于总是会复制返回值的移动语义。

关于c++ - 为什么复制省略是假设规则的异常(exception)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51294438/

相关文章:

c++ - 如何将字符串迭代器变量传递给C++中的函数?

c++ - 在 opencv c++ 中确定 StatModel 的类型

c++ - 为什么对象复制要构造和销毁两次?

c++ - 为什么不能消除无限循环?

c++ - C++ as-if 规则是否允许存储重新排序?

c++ - 使用 Lambda/Template/SFINAE 自动化 try/catch-safeguarding trampoline 函数

c++ - 使用 Qt 静态构建库时出现链接错误

c++ - 为什么 NRVO 在下面的代码中启动 g++?

c++ - 转换为右值引用可防止复制省略

c++ - 执行时间为零的循环