2013-10-13 49 views
6

“我们可以initializate为此我们没有使用定义 任何构造函数的类的对象。拷贝构造函数的花括号初始化

  • 按成员初始化
  • 拷贝初始化
  • 默认初始化。

例如:

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 

The C++ Programming Language 4th Ed。章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; 
    } 

这必须工作,althought我得到一个编译错误尽可能多的与海湾合作委员会与锵。这两个编译器中的错误是“无法将数据转换为整数”。但是,实现复制构造函数这个错误消失或不实现它,但使用圆括号语法。问题是有点愚蠢,改变圆括号的问题得到解决。但为什么不遵循TC++ PL的规则?是一个汇编问题还是我误解了某些东西?提前致谢。

+0

这是由一个DR修复到C++ 14,[请参阅此处](http://stackoverflow.com/questions/31776359/explicit-copy-constructor-and-uniform-initialization/31776937) –

回答

9

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

对象或T类型的参考的列表的初始化被定义如下:

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

[...]

- 否则,如果初始化列表具有E类型的单个元件[...]的对象或参考是从元件初始化;

您所期望的第二个项目在我的缩写报价申请,但第一项优先:由于Data确实是一个总的一个元素的列表子句从来没有考虑过。


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

+0

我已编辑来自您的答案的消息和我已经在书中包含代码。在这段代码中似乎应用了第二种行为。 – JoseLuis

+0

@JoseLuis这本书根本不正确。这个工作可能是支持初始化提议的作者的意图,但如果是这样的话,他们没有成功地指定这一点。 – bames53

+0

@JoseLuis:请参阅[勘误表](http://www.stroustrup.com/4th.html),据称已在C++ 14中修复。 –