T :: T(T&)有什么用?

Jia*_* Xu 2 c++ constructor

为什么会出现T::T(T&)时,有T::T(const T&)哪个更适合copy

(可能它用于实现move语义???)

原始描述(证明是错误的melpomene):

C++11,支持一种新形式的复制构造函数T::T(T&)(来自cppreferene/Copy构造函数隐式声明的复制构造函数),我想知道它的实际用途是什么?

mel*_*ene 5

T(T&)在C++ 11中并不新鲜.使用default关键字显式定义自动生成的复制构造函数有什么新功能:

T(const T &) = default;
Run Code Online (Sandbox Code Playgroud)

正如你的链接所说:

一个类可以有多个拷贝构造函数,例如,T::T(const T&)T::T(T&).如果存在某些用户定义的复制构造函数,则用户仍可以使用关键字强制生成隐式声明的复制构造函数default.

在C++ 11之前,如果你T(T&)的类中有一个构造函数,它将阻止自动创建T(const T&)(默认的复制构造函数).从C++ 11开始,你可以拥有它们(用户定义的T(T&)构造函数和自动T(const T&)构造函数).


至于非const复制构造函数的用处,答案是"不多".它确保只能复制可变对象(而不是像临时对象),这不是你通常需要的东西.

(可能它用于实现移动语义???)

这是完全正确的.参见例如auto_ptr(现在从C++标准中删除),这与unique_ptr我们移动语义之前类似.特别是,它有一个可以修改的auto_ptr(auto_ptr &r)构造函数r(这会导致一些不直观的行为,这就是它从语言中删除的原因).

  • 这根本不回答这个问题.OP问的是什么是`T :: T(T&)`,而不是`T :: T(const T&)`. (2认同)