«мы можем инициализировать объекты класса, для которого мы не определили
любой конструктор, использующий:
- поэлементная инициализация.
- копия инициализации.
- инициализация по умолчанию.
Например:
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 ?, это проблема компилятора или я что-то недопонимаю ?. Заранее спасибо.
Я думаю, что поведение соответствует 8.5.4 (инициализация списка), предложение 3:
Инициализация списка объекта или ссылки типа
T
определяется следующим образом:— Если
[…]T
является агрегатом, выполняется агрегатная инициализация (8.5.1).— В противном случае, если список инициализаторов имеет один элемент типа
E
[…] объект или ссылка инициализируются из этого элемента;
Вы ожидали применения второго пункта в моей сокращенной цитате, но первый элемент имеет приоритет: Data
действительно является агрегатом, предложение из одного элемента никогда не рассматривается.
Ваша цитата из книги выглядит как известная ошибка. Язык предположительно будет исправлен в соответствии с книгой в C ++ 14.
Других решений пока нет …