【问题标题】:std::shared_ptr templated vs. non-templated copy/move constructorsstd::shared_ptr 模板化与非模板化复制/移动构造函数
【发布时间】:2016-11-27 05:43:10
【问题描述】:

This page 显示std::shared_ptr 具有模板化和非模板化版本的复制/移动构造函数(页面上的 (9) 和 (10))。同样,它也有两个版本的复制/移动赋值运算符(参见here)。

为什么我们需要非模板版本?单独的模板版本不够吗?

【问题讨论】:

  • 模板永远不是(!)复制/移动构造函数
  • @DieterLücking 如果我们删除(非模板化的)复制/移动构造函数,什么样的代码会中断?
  • ...如果没有非模板构造函数,可能会生成默认构造函数(如果可能的话)。
  • @DieterLücking 但是,它可以“隐藏”复制/移动构造函数(例如,从非常量左值复制时)。

标签: c++ templates c++11 shared-ptr


【解决方案1】:

模板版本不是复制构造函数。根据标准 §12.8[class.copy]/2 我们有:

类 X 的非模板构造函数是复制构造函数,如果它的第一个参数是类型 X&、const X&、volatile X& 或 const volatile X&,并且要么没有其他参数,要么所有其他参数都有默认参数 ( 8.3.6)。

同样,根据 §12.8[class.copy]/17,模板化版本也不是复制赋值运算符:

用户声明的复制赋值运算符 X::operator= 是 X 类的非静态非模板成员函数,只有一个 X、X&、const X&、volatile X& 或 const volatile X& 类型的参数。

对于移动构造函数也是如此(在 §12.8[class.copy]/3):

类 X 的非模板构造函数是移动构造函数,如果其第一个参数类型为 X&&、const X&&、volatile X&& 或 const volatile X&&,并且要么没有其他参数,要么所有其他参数都有默认参数(8.3.6)。

并移动赋值运算符,见 §12.8[class.copy]/19:

用户声明的移动赋值运算符 X::operator= 是类 X 的非静态非模板成员函数,只有一个 X&&、const X&&、volatile X&& 或 const volatile X&& 类型的参数。

【讨论】:

  • 赋值运算符怎么样?
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多