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

何塞·路易斯

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

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

例如:

    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的规则?是编译器问题还是我误解了?提前致谢。

克瑞克(Kerrek SB)

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

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

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

[...]

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

您期望我的缩略语引用中的第二项适用,但是第一项具有优先权:由于Data确实是一个汇总,因此从不考虑one-list子句。


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章