Строительство из вложенного списка инициализаторов с вложенным скобкомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Строительство из вложенного списка инициализаторов с вложенным скобком

Сообщение Anonymous »

У меня есть рабочая программа, которая успешно компилируется в Visual Studio. Но попытка перенести его в GCC/Clang привели к некоторым ошибкам компиляции.
Максимально уменьшенный пример заключается в следующем:

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

#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://gcc.godbolt.org/z/cthfajaa8
Тот же вопрос: какое поведение правильное?

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

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

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

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

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

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