Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在我的代码中调用复制构造函数而不是移动构造函数?_C++_C++11_Rvalue Reference - Fatal编程技术网

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;