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