Разрешение перегрузки между двумя конструкторами от std :: initializer_listC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разрешение перегрузки между двумя конструкторами от std :: initializer_list

Сообщение Anonymous »

В следующей программе struct c имеет два конструктора: один от std :: initializer_list , а другой от std :: initializer_list . Затем объект структуры создается с C {{1}} :

Код: Выделить всё

#include 

struct A {
int i;
};

struct B {
constexpr explicit B(int) {}
};

struct C {
int v;
constexpr C(std::initializer_list) : v(1) {}
constexpr C(std::initializer_list) : v(2) {}
};

static_assert( C{{1}}.v == 1 );
Поскольку только агрегация может быть неявно построен из int , можно ожидать, что C (std :: initializer_list ) предпочтительнее, и программа преуспевает. И действительно, это происходит в Clang. < /P>
Однако GCC жалуется: < /p>

Код: Выделить всё

error: call of overloaded 'C(
)' is ambiguous
note: candidate: 'constexpr C::C(std::initializer_list)'
note: candidate: 'constexpr C::C(std::initializer_list)'
< /code>
и MSVC: < /p>
error C2440: '': cannot convert from 'initializer list' to 'C'
note: No constructor could take the source type, or constructor overload resolution was ambiguous
demo: https://gcc.godbolt.org/z/joz91q4ed
Какой компилятор здесь правильный? И теперь Clang, MSVC и EDG все принимают программу, и только GCC продолжает отвергать ее. Демо: https://gcc.godbolt.org/z/83ejvs49x

Подробнее здесь: https://stackoverflow.com/questions/710 ... lizer-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»