所以我有这段代码(从 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/