【问题标题】:What is the difference between two ways of calling copy constructor? [duplicate]调用复制构造函数的两种方式有什么区别? [复制]
【发布时间】:2020-01-09 05:10:42
【问题描述】:
class SmartPointer
{
int* _data;
public:
    explicit SmartPointer(int* data) : _data(data)
    {}
};

这段代码编译:

SmartPointer p(nullptr);

但是这个没有:

SmartPointer p = nullptr; // error C2440: 'initializing': cannot convert from 'nullptr' to 'SmartPointer'

这两种调用复制构造函数的方式不是等价的吗?

【问题讨论】:

  • 它们不等价。第一个是直接初始化,第二个是复制初始化。都不涉及复制构造函数。
  • 赋值运算符与复制构造函数不同。
  • @Ripi2 代码中没有赋值运算符。
  • 我尝试修复“复制构造函数的两种方式”(只有一种),同时尝试保持答案有效,如果您不喜欢它,只需重新滚动编辑

标签: c++ copy-constructor


【解决方案1】:

该问题与调用复制构造函数无关;我认为您的意思是初始化的两种方式。

第一个是direct initialization,它考虑了所有合适的构造函数,包括explicit 构造函数。第二个是copy initialization,只考虑非explicit的。

复制初始化比直接初始化更宽松:显式构造函数不转换构造函数,也不考虑复制初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2020-01-12
    • 1970-01-01
    • 2014-05-12
    • 2013-06-13
    • 2011-03-15
    • 2012-02-28
    相关资源
    最近更新 更多