Вызов конструктора копии с равномерной инициализацией

Я пытаюсь вызвать конструктор копирования по умолчанию с равномерной инициализацией, но это не работает.

Например:

#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 очень старый.

взгляд на соответствие на godbolt.org

живой пример на wandbox

Другие вопросы по тегам