为什么允许此转换?

时间:2017-06-07 19:07:28

标签: c++

所以我有这个代码(从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);中哪些特别明确的函数调用中没有显式?

1 个答案:

答案 0 :(得分:4)

执行B bar(foo)意味着您使用foo作为参数调用B的构造函数,这是explicit构造。而当您调用fn(foo)时,编译器会尝试隐式转换foo以匹配函数参数类型,这是implicit转换,因此不允许,因为您的转换构造函数标记为{{ 1}}。