C++ 没有调用构造函数?

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&&)

我试图理解使用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 ; }
};
但是在实现的构造函数中没有调用任何构造函数

有什么解释吗?谢谢大家!

这个

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 ) );