是在按值传递参数时保证的复制构造函数调用
Is a copy constructor call guaranteed when passing argument by value
有人建议我,优化器可以在任何不修改参数的函数中自由交换通过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());
在这种情况下,可能不会打印消息。
此外,如果复制构造函数没有副作用,那么在任何情况下(无论参数是否是临时的(,都可以根据"好像"规则来消除复制,因为这样做不会影响程序的可见行为。
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- 减少复制构造函数调用
- 复制elision、std::move和链式函数调用
- 在实现和调用时可以复制函数参数名称吗?
- linux 是否"rename"函数调用块,直到复制(当源和目标在不同磁盘中时)完成
- 在C++11中按值返回构造的对象时,避免复制构造函数调用
- 从复制构造函数调用构造函数
- 循环复制构造函数调用
- C++继承的复制构造函数调用
- 创建新线程时复制构造函数调用
- 转发构造函数调用基类的复制构造函数2次
- 复制构造函数调用错误
- 复制构造函数调用
- 使用 "new" 复制构造函数调用
- 复制构造函数调用
- 从定义的复制构造函数调用默认(隐式)复制构造函数
- 显式复制构造函数调用语法
- 如何让复制构造函数通过可变参数构造函数调用
- 复制构造函数调用 - 返回值
- 复制构造函数调用C++