Копировать конструктор фигурных скобок инициализации

«мы можем инициализировать объекты класса, для которого мы не определили
любой конструктор, использующий:

  • поэлементная инициализация.
  • копия инициализации.
  • инициализация по умолчанию.

Например:

    struct Work {
string author;
string name;
int year;
};

Work s9 { "Bethoven",
"Symphony No. 9 in D minor, Op. 125; Choral",
1824
};                    // memberwise initialization

Work currently_playing {s9};  // copy initialization
Work none {};                 // default initialization

Язык программирования C ++ 4-е изд. Глава 17.3.1

Например:

   struct Data
{
int mMember1;
float mMember2;
char mMember3;
};

int main()
{
Data aData_1{1,0.3,33};
Data aData_2{aData_1};

return EXIT_SUCCESS;
}

Это должно работать, хотя я получаю ошибку компилятора столько же с GCC, сколько с Clang. Ошибка «не может преобразовать данные в int» в обоих компиляторах. Однако при реализации конструктора копирования эта ошибка исчезает или не реализуя ее, а используя синтаксис круглых скобок. Проблема немного глупая, и изменение фигурных скобок для круглых скобок решает проблему. Но почему не соблюдаются правила TC ++ PL ?, это проблема компилятора или я что-то недопонимаю ?. Заранее спасибо.

7

Решение

Я думаю, что поведение соответствует 8.5.4 (инициализация списка), предложение 3:

Инициализация списка объекта или ссылки типа T определяется следующим образом:

— Если T является агрегатом, выполняется агрегатная инициализация (8.5.1).

[…]

— В противном случае, если список инициализаторов имеет один элемент типа E […] объект или ссылка инициализируются из этого элемента;

Вы ожидали применения второго пункта в моей сокращенной цитате, но первый элемент имеет приоритет: Data действительно является агрегатом, предложение из одного элемента никогда не рассматривается.


Ваша цитата из книги выглядит как известная ошибка. Язык предположительно будет исправлен в соответствии с книгой в C ++ 14.

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]