显式复制构造函数调用语法

时间:2015-01-18 13:49:24

标签: c++ copy-constructor explicit

当我将我的复制构造函数声明为显式时,使用=而不是()调用它不会编译。这是我的代码:

class Base
{
    public:
        explicit Base(){cout<<__PRETTY_FUNCTION__<<endl;}
        explicit Base(Base& b){cout <<__PRETTY_FUNCTION__<<endl;}
};

int main()
{
    Base a;
    Base b=a;
}

编译器说:

  

错误:没有匹配函数来调用'Base :: Base(Base&amp;)'

如果我将其更改为

Base b(a);

编译好。我认为C ++认为这两种实例的样式是相同的。如果我删除显式关键字,它确实有两种方式。我猜测当我使用=时会发生一些隐式转换。那我在这里错过了什么?

1 个答案:

答案 0 :(得分:3)

不,他们不一样。 C ++标准部分§12.3.1[class.conv.ctor]

  

显式构造函数构造对象就像非显式一样   构造函数,但只在直接初始化语法的地方这样做   (8.5)或明确使用演员表(5.2.9,5.4)


Base b(a); // Direct initialization
Base b=a;  // Copy initialization

复制初始化(使用=)不考虑显式构造函数,而是直接初始化(使用())。

如果要使用复制初始化,则必须使用强制转换或使构造函数不显式。