复制构造函数花括号初始化

时间:2013-10-13 15:42:17

标签: c++ c++11 copy-constructor uniform-initialization

  

“我们可以初始化我们尚未定义的类的对象   任何构造函数使用:

     
      
  • 成员初始化。
  •   
  • 复制初始化。
  •   
  • 默认初始化。
  •   
     

例如:

    struct Work {
      string author;
      string name;
      int year;
    };

    Work s9 { "Bethoven",
              "Symphony No. 9 in D minor, Op. 125; Choral",
              1824
            };                    // memberwise initialization

    Work currently_playing {s9};  // copy initialization
    Work none {};                 // default initialization

C ++编程语言第四版。第17.3.1章

例如:

   struct Data
     {
        int mMember1;
        float mMember2;
        char mMember3;
     };

     int main()
     {
         Data aData_1{1,0.3,33};
         Data aData_2{aData_1};

         return EXIT_SUCCESS;
     }

这一定必须正常工作,尽管我在GCC中遇到的编译错误与Clang一样多。两个编译器中的错误是“无法将数据转换为int”。但是,实现复制构造函数时,此错误会消失,或者不使用圆括号语法实现它。问题是有点愚蠢,并改变圆形括号的卷曲问题得到解决。但为什么TC ++ PL的规则没有被遵循?,是一个编译器问题还是我误解了什么?提前谢谢。

1 个答案:

答案 0 :(得分:10)

我认为该行为符合8.5.4(列表初始化),句子3:

  

类型T的对象或引用的列表初始化定义如下:

     

- 如果T是聚合,则执行聚合初始化(8.5.1)。

     

[...]

     

- 否则,如果初始化列表具有类型E [...]的单个元素,则从该元素初始化对象或引用;

您希望我的缩写引用中的第二项适用,但第一项优先:由于Data确实是一个聚合,因此永远不会考虑one-element-list子句。


本书的引用似乎是known error。据称该语言将被修复以匹配C ++ 14中的书。