从这个参考,它允许const
右值作为移动构造函数
Type::Type( const Type&& other );
可移动物体怎么可能const
?即使这在技术上是允许的,是否存在这样的声明有用的情况?
从这个参考,它允许const
右值作为移动构造函数
Type::Type( const Type&& other );
可移动物体怎么可能const
?即使这在技术上是允许的,是否存在这样的声明有用的情况?
可移动物体怎么可能
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 。
有关此功能意图的一些背景信息。
右值引用 - 来自 Bjarne Stroustrup 的博客
一个有趣的问题。我在某个地方读到了 Stroustrup 对这个问题的解释,但似乎无法找到它。希望以上内容有所帮助。