使用统一初始化调用复制构造函数

时间:2017-09-21 08:54:53

标签: c++11 g++4.8

我尝试使用统一初始化调用默认复制构造函数,但它无效。

例如:

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 ^

编译器出错:

Normal

没有统一的初始化工作来复制初始化对象吗?

2 个答案:

答案 0 :(得分:3)

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

  

如果T是聚合类,则初始化列表只有一个   cv U类型的元素,其中U是T或从T派生的类,   object从该元素初始化(通过复制初始化)   copy-list-initialization,或者直接初始化   直接一览初始化)。

来源:

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

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

答案 1 :(得分:2)

这是旧的g ++错误或旧的核心语言缺陷。您的代码从g ++ 5开始正确编译。我强烈建议您更新编译器,因为4.8非常旧。

conformance view on godbolt.org

live example on wandbox