当移动和复制构造函数都存在时,将调用哪一个?

Gay*_*hri 12 c++ copy move language-lawyer

下面是A类,它充满了不同类型的构造函数.如果我对移动构造函数进行注释,则复制构造函数被调用两次:一次是通过值传递一个对象来实现函数的乐趣,另一次是从同一个函数返回.

代码片段

A级{

int x;

public :
A() {
    cout<<"Default Constructor\n";
}

A(A&& a) : x(a.x){
    cout<<"Move Constructor\n";
    a.x=0;
}

A(const A& a){
    x=a.x;
    cout<<"Copy Constructor\n";
}

A fun(A a){
    return a;
}
Run Code Online (Sandbox Code Playgroud)

};

int main(){

A a;
A b;
A c;
c=a.fun(b);
Run Code Online (Sandbox Code Playgroud)

}

输出:

Default Constructor

Default Constructor

Default Constructor

Copy Constructor

Move Constructor
Run Code Online (Sandbox Code Playgroud)

但是,如果存在移动构造函数,则调用它而不是复制构造函数.任何人都可以通过一个很好的例子来阐述这个问题,这样我就可以清楚这个概念.

非常感谢你的帮助.谢谢.

Pra*_*han 8

该标准允许在return语句中的表达式是自动持续时间变量的情况下使用特殊情况.在这种情况下,构造函数重载被拾取仿佛在表达return是一个rvalue.

更确切地说,如果return语句中的表达式是一个自动持续时间变量,它有资格进行复制省略,或者如果你忽略了它是一个函数参数的事实,那么编译器需要将它作为一个rvalue处理出于重载分辨率的目的.请注意,在C++ 11中,return语句的表达式需要具有cv-unqualified类型作为函数返回类型.这在C++ 14中有所放松.

例如,在C++ 11中,以下代码调用的是复制构造函数A,而不是移动构造函数:

class A
{
};

class B
{
public:
B(A a) : a(std::move(a)){}
A a;
};

B f(A a)
{
return a;///When this is implicitly converted to `B` by calling the constructor `B(a)`, the copy constructor will be invoked in C++11. This behaviour has been fixed in C++14.
}
Run Code Online (Sandbox Code Playgroud)