显式复制构造函数调用语法
Explicit Copy constructor call syntax
当我将我的复制构造函数声明为显式时,使用 = 而不是 () 调用它不会编译。这是我的代码:
class Base
{
public:
explicit Base(){cout<<__PRETTY_FUNCTION__<<endl;}
explicit Base(Base& b){cout <<__PRETTY_FUNCTION__<<endl;}
};
int main()
{
Base a;
Base b=a;
}
编译器说:
error: no matching function for call to ‘Base::Base(Base&)’
如果我把它改成
Base b(a);
编译正常。我认为 C++ 认为这两种实例化样式相同。如果我删除 explicit 关键字,它确实可以双向工作。我猜当我使用 = 时会发生一些隐式转换。那么我在这里缺少什么?
不,它们不一样。 C++ 标准部分§ 12.3.1 [class.conv.ctor]
An explicit constructor constructs objects just like non-explicit
constructors, but does so only where the direct-initialization syntax
(8.5) or where casts (5.2.9, 5.4) are explicitly used
Base b(a); // Direct initialization
Base b=a; // Copy initialization
复制初始化(使用 =
)不考虑 显式 构造函数,但直接初始化(使用 ()
)考虑。
如果您想使用复制初始化,则必须使用强制转换或使您的构造函数非显式。
当我将我的复制构造函数声明为显式时,使用 = 而不是 () 调用它不会编译。这是我的代码:
class Base
{
public:
explicit Base(){cout<<__PRETTY_FUNCTION__<<endl;}
explicit Base(Base& b){cout <<__PRETTY_FUNCTION__<<endl;}
};
int main()
{
Base a;
Base b=a;
}
编译器说:
error: no matching function for call to ‘Base::Base(Base&)’
如果我把它改成
Base b(a);
编译正常。我认为 C++ 认为这两种实例化样式相同。如果我删除 explicit 关键字,它确实可以双向工作。我猜当我使用 = 时会发生一些隐式转换。那么我在这里缺少什么?
不,它们不一样。 C++ 标准部分§ 12.3.1 [class.conv.ctor]
An explicit constructor constructs objects just like non-explicit constructors, but does so only where the direct-initialization syntax (8.5) or where casts (5.2.9, 5.4) are explicitly used
Base b(a); // Direct initialization
Base b=a; // Copy initialization
复制初始化(使用 =
)不考虑 显式 构造函数,但直接初始化(使用 ()
)考虑。
如果您想使用复制初始化,则必须使用强制转换或使您的构造函数非显式。