簡體   English   中英

使用統一初始化調用復制構造函數

[英]calling copy constructor with uniform initialization

我試圖通過統一初始化調用默認復制構造函數,但它不起作用。

例如:

#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
                            ^

是不是統一初始化工作來復制初始化對象?

這是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#Explanation

這可能是舊的g ++錯誤或舊的核心語言缺陷。 您的代碼從g ++ 5開始正確編譯。我強烈建議您更新編譯器,因為4.8非常舊。

godbolt.org上的一致性觀點

wandbox上的實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM