Sai*_*idi 2 c++ constructor class copy-elision
我试图理解使用l/r值调用的构造函数,所以我创建了class A以下内容:
class A {
public :
A() { cout << "called default constructor" << endl ; }
A(const A&) { cout << "called copy constructor" << endl ; }
A(const A&&) { cout << "called move constructor" << endl ; }
};
Run Code Online (Sandbox Code Playgroud)
在主函数中,我创建了一个实例 a
int main()
{
A a(A());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在已实现的构造函数中没有调用构造函数!
有什么解释吗?谢谢你!
这个
A a(A());
Run Code Online (Sandbox Code Playgroud)
是一个函数声明,它具有返回类型A和该类型的一个参数A(),它是一种不接受任何参数并返回一个A. 编译器隐式地将参数调整为指针类型以实现类似A (*)().
要声明一个对象,你应该写
A a( ( A() ));
Run Code Online (Sandbox Code Playgroud)
或者
A a {A()};
Run Code Online (Sandbox Code Playgroud)
或者例如
A a( A{} );
Run Code Online (Sandbox Code Playgroud)
这是一个演示程序
#include <iostream>
using namespace std;
class A {
public :
A() { cout << "called default constructor" << endl ; }
A(const A&) { cout << "called copy constructor" << endl ; }
A(const A&&) { cout << "called move constructor" << endl ; }
};
int main()
{
A a1( ( A() ) );
A a2( A{} );
A a3 { A() };
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出是
called default constructor
called default constructor
called default constructor
Run Code Online (Sandbox Code Playgroud)
请注意,在这些对象声明中存在复制省略。
例如,要调用您可以编写的复制构造函数
A a1;
A a2( a1 );
Run Code Online (Sandbox Code Playgroud)
例如,调用移动构造函数的一种简单方法是
A a1;
A a2( std::move( a1 ) );
Run Code Online (Sandbox Code Playgroud)