Рассмотрим следующее:
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
, поэтому такая неявная конструкция не должна допустимо.