从this引用,它允许const
rvalue作为移动构造函数
Type::Type( const Type&& other );
可移动物体如何const
?即使这在技术上是允许的,是否存在这种声明有用的情况?
答案 0 :(得分:8)
可移动物体如何成为
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 rvalue提供不同的重载,并委托给复制构造函数:
Type(const Type&& t) : Type(t) { }
或者,如果您想阻止代码编译,请将其定义为已删除:
Type(const Type&& t) = delete;
有关使用const右值引用的标准中的示例,请参阅https://stackoverflow.com/a/4940642/981959。
答案 1 :(得分:0)
有关此功能的意图的一些背景知识。
Rvalue references - From Bjarne Stroustrup's Blog
A Proposal to Add Move Semantics Support to the C++ Language
一个有趣的问题。我在某处读到了Stroustrup对这个问题的解释,但似乎无法找回它。希望上述内容有所帮助。