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

Is a copy constructor call guaranteed when passing argument by value

本文关键字:复制 函数调用 按值传递 参数      更新时间:2023-10-16

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

或者不同地说,在代码中

struct MyClass {
    MyClass(MyClass const& mc) { std::cout << "xxx" << std::endl; }
};
void foo(MyClass mc) { }
MyClass mc;
foo(mc);

C++标准是否保证总是打印"xxx"?(参考标准(

是的,这里将使用复制构造函数。复制省略仅在某些情况下才允许,由C++112.8/31:指定

  • return语句中
  • 抛出表达式
  • 当一个临时类对象。。。将被复制/移动
  • 当异常处理程序的异常声明声明相同类型的对象时。。。作为异常对象

这些都不适用于这里,尽管如果您传递了一个临时值,则第三个值将适用:

foo(MyClass());

在这种情况下,可能不会打印消息。

此外,如果复制构造函数没有副作用,那么在任何情况下(无论参数是否是临时的(,都可以根据"好像"规则来消除复制,因为这样做不会影响程序的可见行为。