[英]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]编译的
您的代码段扩展为
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.