繁体   English   中英

C ++ 11:使用std :: move()的'decltype类实例声明'不会调用'move constructor'。 为什么?

[英]C++11: 'decltype class instance declaration' with std::move( ) doesn't call 'move constructor.' Why?

我最近开始使用c ++ ,我选择学习c ++ 11的功能。 但是c ++代码的运行方式有时并不那么明显。

下面是我的代码。 在具有decltype(std::move(sample)) sample2 = std::move(sample);的部分decltype(std::move(sample)) sample2 = std::move(sample); 我不确定为什么这行不会调用move构造函数。 你能解释一下原因吗?

#include <iostream>

class AAA
{
   public:
      AAA() { std::cout << "default constructor" << std::endl; }
      AAA(const AAA& cs) { std::cout << "copy constructor" << std::endl; }
      AAA(AAA&& cs) { std::cout << "move constructor" << std::endl; }
      ~AAA() { std::cout << "destructor" << std::endl; }
};

int main(int argc, char* args[])
{
    AAA sample;
// ((right here))
    decltype(std::move(sample)) sample2 = std::move(sample); 
    return 0;
}

它是在[ubuntu 16.04 LTS]上用[gcc 5.4.0]编译的

原始代码: https//ide.geeksforgeeks.org/tALvLuSNbN

您的代码段扩展为

AAA&& sample2 = std::move(sample);

它将rvalue( std::move(sample)的结果)绑定到右值引用( sample2 )。 没有构造新对象,因此不会调用这样的构造函数。

函数std::move<T>返回一个T && ,因此对于std::move(sample)它返回AAA && 这是一个右值引用 ,其行为很像左值引用 (类似AAA &的类型AAA &并且是左值引用),因为它们都是已存在的对象的别名。

重要的是要理解std::move本身并不会导致任何移动。 它只是返回一个rvalue引用给它给出的参数。 例如std::move(foo); 独自完全没有。 仅当结果用于初始化或分配给对象时才有用。

例如auto bar = std::move(foo); 将返回一个rvalue引用foo并使用该引用调用bar的构造函数。

要回答这个问题,因为std::move(sample)返回一个AAA && ,所讨论的行与AAA && sample2 = std::move(sample); 行为实际上与AAA & sample2 = sample; 在这两种情况下,您都在初始化对现有对象的引用,并且不需要构造新对象。

如果您的目标是将sample移动到新的AAA ,则正确的行将是auto sample2 = std::move(sample); 就像你使用sample3 虽然要注意线sample3正在从已经移动的sample移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM