2012-12-28 51 views
8

this参考,它允许const右值作为移动构造函数移动构造函数签名

Type::Type(const Type&& other); 

可移动物体怎么能const?即使这在技术上是允许的,是否有这种声明会有用的情况?

+4

简单的回答:不,没有,因为它打破了移动语义学的整个目的。还要注意'&&'不一定要说“可移动”。它只是说“右值参考”。并且* MoveConstructible *在没有移动的情况下会复制,所以你可以说'T const &&'move ctor可能只是复制,但是呃。 – Xeo

+0

好吧,'Type'可以声明一个'mutable'变量,'mutable'变量*可以''const'移动构造函数修改。因此,一个'const'移动构造函数可以做一个对象的浅拷贝(而一个拷贝构造函数可以做一个深层拷贝),并且在被移动的地方设置一个叫做'dead'的可变布尔标志或者类似的''true'目的。然后'Type'(最重要的是析构函数)的函数将检查该标志。这是无稽之谈吗? –

回答

9

可移动物体如何成为const

它不能,但那不是语言所说的。该语言表示具有该签名的构造函数是一个“移动构造函数”,但这并不意味着该参数被移出,而只是意味着构造函数符合“移动构造函数”的要求。移动构造函数不需要移动任何东西,如果参数是const它不能。

有没有这种情况下这种声明是有用的?

是的,但不是很经常。如果要防止在const临时变量作为参数传递时通过重载解析来选择另一个构造函数,这会很有用。

struct Type 
{ 
    template<typename T> 
    Type(T&&); // accepts anything 

    Type(const Type&) = default;  
    Type(Type&&) = default; 
}; 

typedef const Type CType; 

CType func(); 

Type t(func()); // calls Type(T&&) 

在此代码func()临时返回将不完全匹配的复制或移动建设者的参数,所以会调用接受任何类型的模板构造。为了防止这种情况,你可以提供不同的过载取一个const右值,并委托授权的拷贝构造函数:

Type(const Type&& t) : Type(t) { } 

或者,如果你想防止代码编译,将其定义为删除:

Type(const Type&& t) = delete; 

有关使用const rvalue引用的标准示例,请参阅https://stackoverflow.com/a/4940642/981959