Вызов конструктора копии с равномерной инициализацией
Я пытаюсь вызвать конструктор копирования по умолчанию с равномерной инициализацией, но это не работает.
Например:
#include <string>
struct Work {
std::string author;
std::string name;
int year;
};
int main() {
Work s9 {"Beethoven", "Symphony No. 9 in D minor, Op. 125; Choral", 1824}; // memberwise initialization
Work currently_playing {s9}; // copy initialization
return 0;
}
Я собираю это как: g++ -std=c++11 -c Ex1.cpp
И компилятор выдает ошибку:
Ex1.cpp: In function ‘int main()’:
Ex1.cpp:11:28: error: could not convert ‘s9’ from ‘Work’ to ‘std::string {aka std::basic_string<char>}’
Work currently_playing {s9}; // copy initialization
^
Не работает ли единообразная инициализация для копирования объекта инициализации?
2 ответа
Это ошибка в стандарте C++11. C++14 изменил способ инициализации списка. В C++11 X{X{}}
будет выполнять агрегатную инициализацию, если X
это агрегатный тип. C++14 добавил дополнительное предложение, чтобы этот код правильно вызывал соответствующий конструктор; [Dcl.init.list]/3.2:
Если T является агрегатным классом, а список инициализаторов имеет один элемент типа cv U, где U - это T или класс, производный от T, объект инициализируется из этого элемента (путем инициализации копирования для инициализации копирования списка или прямой инициализацией для прямой инициализации списка).
Источники:
http://eel.is/c++draft/dcl.init.list#3.2
http://en.cppreference.com/w/cpp/language/list_initialization
Это либо старая ошибка g++, либо старый дефект основного языка. Ваш код правильно компилируется, начиная с g++ 5. Я настоятельно рекомендую вам обновить ваш компилятор, так как 4.8 очень старый.