【问题标题】:Copy constructor curly braces initialization复制构造函数花括号初始化
【发布时间】:2023-03-05 10:02:02
【问题描述】:

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

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

例如:

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

【问题讨论】:

  • 这已由 DR 修复到 C++14,see here

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


【解决方案1】:

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

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

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

[...]

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

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


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

【讨论】:

  • 我已根据您的回答编辑了消息,并将代码包含在书中。在这段代码中似乎应用了第二种行为。
  • @JoseLuis 这本书完全不正确。大括号初始化提案的作者的意图可能是这项工作,但如果是这样,那么他们没有成功指定这一点。
  • @JoseLuis:参见errata,据称已在 C++14 中修复。
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2013-09-16
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多