Максимально уменьшенный пример заключается в следующем:
Код: Выделить всё
#include
struct A {
A(const std::vector &) {}
};
A a( { { 1, 2 } } );
< /code>
GCC и Clang жалуются: < /p>
error: call of overloaded 'A(
)' is ambiguous
7 | A a( { { 1, 2 } } );
| ^
note: there are 3 candidates
note: candidate 1: 'A::A(const std::vector&)'
note: candidate 2: 'constexpr A::A(const A&)'
note: candidate 3: 'constexpr A::A(A&&)'
< /code>
Но EDG соглашается с MSVC, что программа в порядке. Онлайн демонстрация: https://gcc.godbolt.org/z/msjc9f1nk
Есть ли здесь реальная двусмысленность, и какая реализация верна? class = "lang-cpp prettyprint-override">struct B {
int i, j;
};
struct A {
A(A&&) = delete;
A(const B &) {}
};
A a( { { 1, 2 } } );
< /code>
Это принято GCC и EDG. Но как Clang, так и MSVC отвергают это с < /p>
error: call to deleted constructor of 'A'
error C2280: 'A::A(A &&)': attempting to reference a deleted function
Тот же вопрос: какое поведение правильное?
Подробнее здесь: https://stackoverflow.com/questions/795 ... lizer-list