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)
但是,如果存在移动构造函数,则调用它而不是复制构造函数.任何人都可以通过一个很好的例子来阐述这个问题,这样我就可以清楚这个概念.
非常感谢你的帮助.谢谢.
该标准允许在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)