class MyClass
{
public:
int a;
MyClass(int r): a(r) {}
MyClass(const MyClass& ref)
{
cout << "Copy Constructor\n";
a= ref.a;
}
};
int main()
{
MyClass obj(5);
MyClass obj1(MyClass(5)); //Case 1
MyClass obj2(obj); //Case 2
return 0;
}
为什么在案例2中调用复制构造函数,而不是在案例1中调用。 在案例1中,临时对象作为参数传递。
答案 0 :(得分:2)
在MyClass obj1(MyClass(5));
中,编译器省略了临时对象MyClass(5)
,因为它是允许的。
特别是,C ++标准2014§12.8第31段,定义了可以执行 copy elision 的案例:
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用......复制/移动操作的省略,称为复制省略,在以下情况下是允许的(其中 可以合并以消除多个副本):
- 当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略副本/移动的目标。