没有调用构造函数?

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)

但是在已实现的构造函数中没有调用构造函数!

有什么解释吗?谢谢你!

Vla*_*cow 5

这个

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)