Инициализация элемента MSVC по умолчанию с совокупной ошибкой инициализации C2440C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Инициализация элемента MSVC по умолчанию с совокупной ошибкой инициализации C2440

Сообщение Anonymous »

У меня возникли проблемы с использованием агрегатных инициализаторов для инициализации POD с инициализаторами членов по умолчанию.
Согласно этой статье, этот фрагмент кода должен работать:

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

struct Something
{
int x;
int y {};    // default initializer with default value
int z { 2 }; // default initializer with specific value
};

int main()
{
Something s1;
Something s2 { 5, 6, 7 }; // this cause error C2440 in MSVC14.0
Something s3 {};
return 0;
}
Но компилятор выдал ошибку C2440:

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

..\TestAnything\main.cpp(11): error C2440: 'initializing': cannot convert from 'initializer list' to 'Something'
..\TestAnything\main.cpp(11): note: No constructor could take the source type, or constructor overload resolution was ambiguous
Если я удалю инициализаторы значений int y и int z, код можно будет успешно скомпилировать.

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

struct Something
{
int x;
int y; // no default initializer
int z; // no default initializer
};

int main()
{
Something s1;
Something s2 { 5, 6, 7 }; // this works fine
Something s3 {};
return 0;
}
Обратите внимание, что я использую MSVC14.00 (VS2015). Я также попробовал MSVC14.29 (VS2019), и он смог успешно скомпилировать код. Это означает, что только MSVC14.00 имеет эту проблему.

Поскольку мне не удалось найти никаких заметок об этой практике в cppreference, Я не уверен, использую ли я UB или это просто ошибка MSVC14.00. Есть идеи?

Благодаря добрым комментариям, похоже, это ошибка этой версии MSVC. Однако я все еще не уверен, соответствует ли эта практика стандартам C++11? Я имею в виду, что большинство из нас знакомы с этой формой инициализации POD. Но я не могу найти или вывести из справочника CPP точную информацию о поведении таких кодов.

Подробнее здесь: https://stackoverflow.com/questions/793 ... rror-c2440
Ответить

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

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

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

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

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