Как войти в список инициализатора, и членский инициализатор класса сотрудничают?

Следующий код ни собирает с-std=c ++ 11 под gcc-4.7.1, ни лязгом 3.2. Таким образом, я думаю, что сделал что-то не так. Но я не знаю почему. Кто-то может дать мне намек? В основном, если я удаляю членский инициализатор в классе для X, он работает. Итак, почему инициализатор не перечисляет работу с членским инициализатором в классе?

struct X {
    int x = 1;
    int y = 1;
};

int main() {
    X x = {1, 2};
}

ошибка компиляции gcc:

a.cpp: In function 'int main()':
a.cpp:7:16: error: could not convert '{1, 2}' from '' to 'X'
9
nl ja de
@IvayloStrandjev, Поскольку я упомянул, да.
добавлено автор Kan Li, источник
Вещь состоит в том, что, когда у вас есть инициализаторы, это формирует эквивалент X (): x {1}, y {1} {} , который I' ставка ll то, почему совокупная инициализация doesn' t работа.
добавлено автор chris, источник
@juanchopanza, я надеялся найти ссылку, и вы сделали:)
добавлено автор chris, источник
@chris вы правы снова. X не является совокупностью, согласно 8.5.1. Посмотрите редактируют к моему ответу.
добавлено автор juanchopanza, источник
Те = 1; в участнике decls, которые всегда делают быть двойными - берут.
добавлено автор WhozCraig, источник
@chris я просто думал то же самое. Конструктор по умолчанию с предварительно построенным списком инициализатора был бы вероятным результатом, используя такие инициализаторы в классе.
добавлено автор WhozCraig, источник

1 ответы

При наличии инициализации нестатических элементов данных при декларации ваш класс больше не совокупность (см. 8.5.1 Совокупностей [decl.init.aggr] ).

Работа должна добавить конструктора с двумя параметрами. Это позволяет вам использовать инициализацию списка инициализатора, которая позволяет тот же самый синтаксис как совокупная инициализация, даже если ваш класс не технически совокупность.

struct X {
  X(int x, int y) : x(x), y(y) {}
    int x = 1;
    int y = 1;
};

int main() 
{
    X x1{1, 2};
    X x2 = {1,2};
}

Note: These rules have been relaxed for C++1y, meaning your type would indeed be an aggregate.

12
добавлено
+1 для справки. Я подозревал, что что-то вроде этого кроме вас избило меня к удару: p
добавлено автор Matthieu M., источник
@Xeo, Верный. Тот же самый синтаксис, хотя: p
добавлено автор chris, источник
"Это позволяет вам использовать совокупную инициализацию" - это не совсем правильно, что you' ре, делающее теперь, называют инициализацией списка .
добавлено автор Xeo, источник
@Xeo я перефразировал свой ответ. Спасибо за комментарий.
добавлено автор juanchopanza, источник
@DwayneRobinson нет, это wouldn' t работа. Однако для C++ 14 этих правил были смягчены, таким образом, OP' s тип на самом деле была бы совокупность. Я могу добавить примечание по этому.
добавлено автор juanchopanza, источник
Поочередно, мог ожидаемая функциональность быть восстановленной, явно объявляя конструктора по умолчанию (новый C++ 11 Фу() = дефолтом)? icando' s случай однозначно и ясно стручок. Так it' s печальный видеть эти две вещи быть взаимоисключающими, так как ценности NSDMI - действительно более справедливые дефолты, если что-то более определенное не назначено.
добавлено автор Dwayne Robinson, источник
@juanchopanza Похож, это - то, которое решит проблему в будущем: open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3605.html
добавлено автор Dwayne Robinson, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest