C++ 没有调用构造函数?
我试图理解使用l/r值调用的构造函数,因此我创建了下面的C++ 没有调用构造函数?,c++,class,constructor,copy-elision,C++,Class,Constructor,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&&)
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 ; }
};
但是在实现的构造函数中没有调用任何构造函数
有什么解释吗?谢谢大家! 这个
A a(A());
是一个函数声明,其返回类型为a
和一个类型为a()
的参数,该函数类型不带任何参数,并返回a
。编译器隐式地将参数调整为指针类型,以实现类似A(*)(
)的函数
要声明对象,您应该编写
A a( ( A() ));
或
比如说
A a( A{} );
A a1;
A a2( std::move( a1 ) );
这是一个演示程序
#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;
}
请注意,在这些对象声明中存在副本省略
例如,调用可以编写的复制构造函数
A a1;
A a2( a1 );
调用move构造函数的一种简单方法是
A a( A{} );
A a1;
A a2( std::move( a1 ) );
使用
{}
调用构造函数时,A(A())
被解释为函数声明。这是否回答了您的问题?Clang对此提出警告,因为“括号作为函数声明[-Wvexing parse]被消除了歧义”。尝试使用a
作为对象,您会感到惊讶代码>@rafix07你说得对。:)
A a1;
A a2( std::move( a1 ) );