在按值传递参数时,是否保证复制构造函数调用

时间:2014-07-24 14:17:54

标签: c++

有人向我建议允许优化器在任何不修改参数的函数中自由地交换参数传递const引用和参数传递值。这是C ++标准允许的吗?

或者在代码

中另有说明
struct MyClass {
    MyClass(MyClass const& mc) { std::cout << "xxx" << std::endl; }
};

void foo(MyClass mc) { }

MyClass mc;
foo(mc);

C ++标准是否保证&#34; xxx&#34;总是打印? (参考标准赞赏)

1 个答案:

答案 0 :(得分:8)

是的,这里将使用复制构造函数。只有在C ++ 11 12.8 / 31:

指定的某些情况下才允许复制省略
  • return声明......
  • throw-expression ...
  • 当临时类对象...将被复制/移动时......
  • 当异常处理程序的 exception-declaration 声明一个相同类型的对象时......作为异常对象

这些都不适用于此,但如果您传递了临时值,则第三个适用:

foo(MyClass());

在这种情况下,可能无法打印消息。

此外,如果复制构造函数没有副作用,那么在任何情况下(无论参数是否是临时的),副本都可以在“as-if”规则下省略,因为这样做不会影响程序的可见行为。