“我们可以初始化我们尚未定义的类的对象 任何构造函数使用:
- 成员初始化。
- 复制初始化。
- 默认初始化。
例如:
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的规则没有被遵循?,是一个编译器问题还是我误解了什么?提前谢谢。
答案 0 :(得分:10)
我认为该行为符合8.5.4(列表初始化),句子3:
类型
T
的对象或引用的列表初始化定义如下:- 如果
T
是聚合,则执行聚合初始化(8.5.1)。[...]
- 否则,如果初始化列表具有类型
E
[...]的单个元素,则从该元素初始化对象或引用;
您希望我的缩写引用中的第二项适用,但第一项优先:由于Data
确实是一个聚合,因此永远不会考虑one-element-list子句。
本书的引用似乎是known error。据称该语言将被修复以匹配C ++ 14中的书。