9

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

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

例如:

    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++ 编程语言第 4 版。第 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 的规则?,是编译器问题还是我误解了什么?提前致谢。

4

1 回答 1

11

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

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

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

[...]

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

您期望我的缩写报价中的第二项适用,但第一项优先:因为Data确实是一个聚合,所以从不考虑单元素列表子句。


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

于 2013-10-13T15:57:06.700 回答