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

Explicit Copy constructor call syntax

本文关键字:函数调用 语法 复制      更新时间:2023-10-16

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

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&)"没有匹配函数

如果我将其更改为

Base b(a);

它编译得很好。我认为C++认为这两种实例化风格相同。如果我删除显式关键字,它确实可以双向工作。我猜当我使用 = 时会发生一些隐式转换。那么我在这里错过了什么?

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

显式构造

函数像非显式构造函数一样构造对象 构造函数,但仅在直接初始化语法的情况下执行此操作 (8.5) 或显式使用强制转换 (5.2.9、5.4) 的地方


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

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

如果要使用

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