所以我有这个代码(从cplusplus.com窃取):
class A {};
class B {
public:
explicit B (const A& x) {}
B& operator= (const A& x) {return *this;}
operator A() {return A();}
};
void fn (B x) {}
int main ()
{
A foo;
B bar (foo);
bar = foo;
foo = bar;
// fn (foo); // not allowed for explicit ctor.
fn (bar);
return 0;
}
因此转换构造函数只能被显式调用,因此不允许fn(foo);
。这让我很困惑,因为如果你不能做B bar (foo);
,为什么你可以做fn(foo);
,我的意思是fn(foo)也最终将类型B的对象初始化为一个对象类型A,类似于语句B bar (foo);
,那么它们都没有产生错误? B bar (foo);
中哪些特别明确的函数调用中没有显式?
答案 0 :(得分:4)
执行B bar(foo)
意味着您使用foo作为参数调用B
的构造函数,这是explicit
构造。而当您调用fn(foo)
时,编译器会尝试隐式转换foo
以匹配函数参数类型,这是implicit
转换,因此不允许,因为您的转换构造函数标记为{{ 1}}。