为什么使用explicit会导致编译器错误

时间:2018-03-02 04:09:48

标签: c++

我见过许多关于显式关键字的帖子,但没有找到答案为什么它失败了。我已经在堆栈溢出中看到了其他帖子但是关于转换它给出的非常混乱的解释

class Foo {
public:
  explicit Foo(int x);
};
int main()
{
Foo a = 42;         //Compile-time error 
Foo b(42);          //OK: calls Foo::Foo(int) passing 42 as an argument
}

我们撰写Foo a = 42;时究竟发生了什么,以及它与Foo b(42);的区别

2 个答案:

答案 0 :(得分:0)

Foo a = 42;

如果可以使用单个参数调用构造函数,那么它就是转换构造函数。可以将单个参数转换为正在构造的类。

要禁止此操作,请将构造函数标记为显式,以便不允许进行此类隐式转换,从而导致错误。

答案 1 :(得分:0)

Foo a = 42;复制初始化

C ++标准规定了

  

显式构造函数不是转换构造函数而不是   考虑进行复制初始化。

参考:http://en.cppreference.com/w/cpp/language/copy_initialization

因此explicit可能是鲜为人知的影响。