由于初始化的形式,构造函数的显式性是否可以被忽略?

Sto*_*ica 8 c++ language-lawyer

考虑这个简单的类型:

struct A {
  A(int, int, int)    {} 
  A(std::vector<int>) {}
}; 

///
A a({1,2,3}); 
Run Code Online (Sandbox Code Playgroud)

上面的代码段构成了一个不正确的程序,因为重载决策失败,因为{1, 2, 3}可以用来初始化临时A,因此复制c'tor也可用于初始化a.

我最初假设标记第一个c'tor explicit A(int, int, int)可用于解决问题.而且Clang同意了.另一方面,海湾合作委员会仍然不接受它,说明两个可行的候选人的同样理由.

更糟糕的是,另一个观察结果使这更令人困惑.如果要使用列表初始化,即A a{{1,2,3}};,然后突然Clang GCC都接受原始类定义不变的代码(没有任何东西explicit).

在哪种编译器符合的情况下A a({1,2,3});