2017-09-21 66 views
3

我试图调用默认拷贝构造函数与统一初始化,但它不工作。调用拷贝构造函数与统一初始化

例如:

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

不统一的初始化工作,以复制初始化对象?

回答

3

这是C++ 11标准的一个错误。 C++ 14改变了如何执行列表初始化。在C++ 11中,如果Xaggregate type,则X{X{}}将执行聚合初始化。 C++ 14添加了一个额外的子句,以便该代码正确调用相应的构造函数; [dcl.init.list] /3.2:

If T is an aggregate class and the initializer list has a single element of type cv U, where U is T or a class derived from T, the object is initialized from that element (by copy-initialization for copy-list-initialization, or by direct-initialization for direct-list-initialization).

来源:

http://eel.is/c++draft/dcl.init.list#3.2

http://en.cppreference.com/w/cpp/language/list_initialization#Explanation