Tag: 聚合初始化

在std :: array初始化中使用Brace elision

假设有一个std::array被初始化。 没关系,如果使用双花括号: std::array<int, 2> x = {{0, 1}}; std::array<int, 2> x{{0, 1}}; 在旧的聚合初始化中使用单个大括号也是可以的,因为大括号将会照顾大括号: std::array<int, 2> x = {0, 1}; 但是,使用单个大括号进行列表初始化可以吗? GCC接受它,Clang拒绝使用“在使用直接列表初始化时,不能忽略子对象初始化时的括号”。 std::array<int, 2> x{0, 1}; 提到大括号的唯一部分是8.5.1 / 12,它说: 使用赋值expression式初始化聚合成员时,将考虑所有隐式types转换(第4章)。 如果赋值expression式可以初始化一个成员,则该成员被初始化。 否则,如果该成员本身是一个子集合,则假定支撑精确,并且为该子集合的第一个成员的初始化考虑赋值expression式。 8.5.1是关于具体的聚合初始化的,所以应该表示铿锵拒绝是正确的吧? 没那么快 8.5.4 / 3说: Ttypes的对象或引用的列表初始化定义如下: […] – 否则,如果T是聚合,则执行聚合初始化(8.5.1)。 我认为这意味着与汇总初始化(包括大括号)一样的规则也适用,这意味着GCC是正确的接受。 我承认,措辞不是特别清楚。 那么,哪个编译器对待第三个片段是正确的呢? 大括号是否在列表初始化中发生,或者不是?

在C ++ 0x中缩小转换。 这只是我,还是这听起来像一个突变?

C ++ 0x将使下面的代码和类似的代码格式不正确,因为它需要一个所谓的缩小到double 转换 。 int a[] = { 1.0 }; 我想知道这种初始化在现实世界的代码中是否用得很多。 有多less代码会被这个改变打破? 如果您的代码受到影响,是否需要在代码中解决这个问题? 作为参考,参见n3225的8.5.4 / 6 缩小转换是一种隐式转换 从浮点型到整型,或者 从long double到double或float,或者从double到float,除非源是常量expression式,并且转换后的实际值在可以表示的值的范围内(即使不能精确表示),或者 从整数types或非范围枚举types转换为浮点types,除非源代码是常量expression式,并且转换后的实际值适合目标types,并在转换回原始types时生成原始值,或者 从整数types或非范围枚举types转换为不能表示原始types的所有值的整数types,除非源代码是常量expression式,并且转换后的实际值将适合目标types,并将在产生原始值时转换回原来的types。

什么时候是一个私人的构造不是一个私人的构造函数?

比方说,我有一个types,我想使其默认构造函数私有。 我写了以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above } […]

C ++ 11使用非静态成员初始值设定项对类进行聚合初始化

标准允许吗? struct A { int a = 3; int b = 3; }; A a{0,1}; // ??? 这个类是聚合的吗? clang接受这个代码,但gcc不。