7

这个参考,它允许const右值作为移动构造函数

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

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

4

2 回答 2

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 右值的不同重载,并委托给复制构造函数:

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

或者如果您想阻止代码编译,请将其定义为已删除:

Type(const Type&& t) = delete;

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

于 2012-12-28T15:06:07.667 回答
0

有关此功能意图的一些背景信息。

右值引用 - 来自 Bjarne Stroustrup 的博客

向 C++ 语言添加移动语义支持的建议

一个有趣的问题。我在某个地方读到了 Stroustrup 对这个问题的解释,但似乎无法找到它。希望以上内容有所帮助。

于 2012-12-29T01:22:59.907 回答