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

Jos*_*uis 7 c++ copy-constructor uniform-initialization c++11

"我们可以初始化一个类的对象,我们没有使用它来定义任何构造函数:

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

例如:

    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
Run Code Online (Sandbox Code Playgroud)

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;
     }
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 10

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

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

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

[...]

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

您期望我的缩写引用中的第二项应用,但第一项优先:因为Data确实是聚合,所以从不考虑one-element-list子句.


您对本书的引用似乎是一个已知的错误.据称该语言将被修复以匹配C++ 14中的书.