移动构造函数签名

时间:2012-12-28 09:44:57

标签: c++ c++11 move-constructor

this引用,它允许const rvalue作为移动构造函数

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

可移动物体如何const?即使这在技术上是允许的,是否存在这种声明有用的情况?

2 个答案:

答案 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对这个问题的解释,但似乎无法找回它。希望上述内容有所帮助。