当我将副本构造函数声明为显式时,使用=而不是()调用它不会编译。这是我的代码:
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
复制初始化(使用=
)不考虑显式构造函数,但直接初始化(使用()
)则考虑。
如果要使用副本初始化,则必须使用强制转换或使构造函数不明确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句