【发布时间】:2018-01-28 19:38:12
【问题描述】:
让我们采用两个结构/类
struct C1{
C1(){};
C1(C1&){std::cout<<"copy"<<std::endl;}
C1(C1&&){std::cout<<"move"<<std::endl;}};
struct C2{
C1 c;
C2(){};
C1 get1(){return c;}
C1 get2(){return std::move(c);}};
然后
C1 a1=C2().c;
C1 a2=C2().get1();
C1 a3=C2().get2();
输出是
move
copy
move
问题
我们知道右值的成员本身就是右值。这就是为什么使用 a1 调用移动构造函数的原因。为什么呢,在 a2 的情况下调用了复制构造函数。我们从一个函数返回一个右值。
换句话说,std::move 强制转换为右值。但是,作为右值的成员,c 已经是一个右值。为什么 a2 和 a3 的行为有区别?
【问题讨论】:
-
你的复制构造函数根本不能用右值调用。每当你看到它被调用时,它并不是复制一个右值,而是出于其他原因。
标签: c++ move-semantics rvalue