c++ - 为什么允许这种转换?

标签 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); 中特别显式而在函数调用中不显式?

最佳答案

执行 B bar(foo) 意味着您正在以 foo 作为参数调用 B 的构造函数,这是一个 显式 构造.而当您调用 fn(foo) 时,编译器会尝试隐式转换 foo 以匹配函数参数类型,这是一个 隐式 转换并且因此不允许,因为您的转换构造函数被标记为 explicit

关于c++ - 为什么允许这种转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44420900/

相关文章:

c++ - 在运行时检查 C++ 共享依赖项(ldd on self)

c++ - VS 调试器中未正确显示具有嵌套类型的 QList

c++ - 通过引用 char 2 维调用字符串不起作用

c++ - 抽象类是否有 VTABLE?

c++ - 在 64 位操作系统上使用 32 位编译器编译的 64 位 float

c++ - 如何将 XML 模式映射到 C/C++ 代码?

c++ - Boost C++ 库中 Log 函数的问题

c++ - 海湾合作委员会错误?链接方法,断序列点

c++ - 包括 C++ 源文件是一种批准的方法吗?

c++ - 为什么 std::array::begin 不返回迭代器?