C++ 为什么在我的代码中调用复制构造函数而不是移动构造函数?
我试图理解移动构造函数和右值引用。 所以我试了这个密码。 但结果让我困惑C++ 为什么在我的代码中调用复制构造函数而不是移动构造函数?,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,我试图理解移动构造函数和右值引用。 所以我试了这个密码。 但结果让我困惑 #包括 #包括 甲级{ 公众: A(){std::cout你把类型和属性弄混了 (强调矿山) 每个C++表达式(一个运算符及其操作数、文字、变量名等)的特征是:两个独立的属性:类型和值类别< /强> < /p> 作为命名变量,a是左值 以下表达式是左值表达式: 变量的名称 然后对于ab=A;选择复制构造函数。正如您所尝试的那样,static\u cast(A);将其转换为xvalue(右值);您也可以使用std::m
#包括
#包括
甲级{
公众:
A(){std::cout你把类型和属性弄混了
(强调矿山)
每个C++表达式(一个运算符及其操作数、文字、变量名等)的特征是:<强>两个独立的属性:类型和值类别< /强> < /p>
作为命名变量,
a
是左值
以下表达式是左值表达式:
- 变量的名称
然后对于ab=A;
选择复制构造函数。正如您所尝试的那样,static\u cast(A);
将其转换为xvalue(右值);您也可以使用std::move
A b = std::move(a);
以下表达式是xvalue表达式:
- 函数调用或重载运算符表达式,其返回类型为对对象的右值引用,例如
std::move(x)
不提供右值。将任何值视为右值的一种方法是,您无法获取它的地址。如果您可以获取它的地址,那么它很可能是左值。
那么,在你的情况下
auto address_of_a = &a;
是可能的(因此,a是左值)
是&&(右值类型)。因此,将类型强制转换为&&将得到右值
A b = a;
失败,因为a是左值,所以它正在查找(常量a&)
将成功,因为现在它将寻找一个(A&&)
如果将移动分配定义为已删除,则将失败
b = c;
如果定义副本分配,则将成功
默认的构造/复制构造/移动或复制赋值只要所有元素都是简单的复制/移动就可以工作。decltype(id表达式)
是一个奇怪的怪兽,与语言的其他部分有不同的规则,这里它为您提供了a&
A b = a;
A b = std::move(a); // or
A b = A{}; // rvalue
A b;
A c = A{};
b = std::move(c);
b = c;