Рассмотрим следующее:
struct A {
A(int, int) { }
};
struct B {
B(A ) { } // (1)
explicit B(int, int ) { } // (2)
};
int main() {
B paren({1, 2}); // (3)
B brace{1, 2}; // (4)
}
Конструкция brace в (4) ясно и недвусмысленно называет (2). В clang конструкция paren в (3) однозначно вызывает (1), где, как и в gcc 5.2, она не скомпилируется с помощью:
main.cpp: In function 'int main()':
main.cpp:11:19: error: call of overloaded 'B(<brace-enclosed initializer list>)' is ambiguous
B paren({1, 2});
^
main.cpp:6:5: note: candidate: B::B(A)
B(A ) { }
^
main.cpp:5:8: note: candidate: constexpr B::B(const B&)
struct B {
^
main.cpp:5:8: note: candidate: constexpr B::B(B&&)
Какой компилятор прав? Я подозреваю, что clang здесь верен, так как двусмысленность в gcc может возникнуть только через путь, который подразумевает неявное построение B{1,2} и передачу этого в конструктор copy/move, но этот конструктор отмечен как explicit, поэтому такая неявная конструкция не должна допустимо.