aggregate-initialization相关内容
在以下代码中,使用大括号类型不同的两种形式使用模板参数演绎对A对象进行了初始化: template struct A{ T x; }; int main() { static_assert( A{1}.x == 1 ); //#1: ok in GCC and MSVC static_assert( A(1).x == 1 ); //#2: o
..
使用C++20,可以为别名模板生成演绎指南(请参阅https://en.cppreference.com/w/cpp/language/class_template_argument_deduction的别名模板演绎一节)。然而,我无法使它们使用聚合初始化语法。在这种情况下,似乎没有生成别名的扣减指南。 请参见此示例: #include template
..
删除了包含POD和默认构造函数的结构。使用-std=c++2a编译时,尝试聚合初始化结构的实例会导致g++9.1中的编译错误。使用-std=c++17可以很好地编译相同的代码。 https://godbolt.org/z/xlRHLL struct S { int a; S() = delete; }; int main() { S s {.a = 0}; }
..
据我了解,以下程序应该可以在C++20模式下运行: #include struct B{ int a0, a1; }; int main() { std::vector bs; bs.emplace_back( 0, 0 ); } 在Visual Studio2019和GCC 11中确实是这样,但在clang 12中不是,这会产生错误:
..
标准中是否允许: 结构体A{int a = 3;整数 b = 3;};一个{0,1};//??? 这个类还聚合吗?clang 接受此代码,但 gcc 不接受. 解决方案 在 C++11 中,具有类内成员初始值设定项使结构/类不是聚合 —然而,这在 C++14 中有所改变.当我第一次遇到它时,我发现这是令人惊讶的,这种限制的基本原理是类内初始化器与用户定义的构造器非常相似,但反论点是没有
..
假设我想引用我已经定义的 initializer_list 的成员.我可以吗? 此代码在 Visual Studio 和 gcc 中编译并给出预期值:“13 55",我会只是想知道这是合法的: const int foo[2] = {13, foo[0] + 42}; 解决方案 所以我们这里有 C++ 标准草案的 8.5.1 部分涵盖的聚合初始化,它说: 聚合是数组或类 [...
..
有关如何插入而不复制地图值. std :: map放置而不复制值 从该答案继续-假设我的 Foo 类型看起来像这样: struct Foo {const int&intref_;std :: mutex Mutex_;} 然后使用像这样的聚合初始化来初始化 Foo {7} 或 Foo {7,std :: mutex()} 以某种方式可以将其放置到地图中吗?:
..
C ++标准库具有 std :: is_constructible 检查是否可以根据给定的类型构造一个类作为参数. 例如,如果我有一个类 MyClass ,它具有一个构造函数 MyClass(int,char),则 std :: is_constructible :: value 将为 true . 是否存在类似的标准库类
..
我有一个结构,其中有许多相同类型的成员,像这样 struct VariablePointers {VariablePtr有效;VariablePtr处于活动状态;VariablePtr文件名;}; 问题是,如果我忘记初始化一个结构成员(例如 wasactive ),就像这样: VariablePointers {activePtr,文件名} 编译器不会抱怨它,但是我将有一个部分初始
..
结构{int a,b;} s = {5,s.a + 1}; 根据标准,在上面的示例中读取"s.a"是否安全,以便将s初始化为a = 5和b = 6?如果是这样,大多数编译器是否遵守此规则? (以上内容在VC10中进行编译.) 解决方案 是的,因为聚合成员初始化是按顺序进行的. [dcl.init.aggr] /2具有: 按8.5.4中的初始化器列表初始化聚合时,初始化
..
我有一个包含位域的结构: struct Foo { unsigned a : 16, b : 16; }; 我想知道是否可以在其位字段上使用聚合初始化.例如: struct Foo bar = {13, 42}; 我注意到,该可以在gcc 5.1和Visual Studio 2015中使用.这是标准批准的C和C ++初始化. 解决方案 从C ++ 14 [dcl
..
C ++ 17对基类的聚合初始化非常棒,但是当基类仅在其中提供某些功能(因此没有数据成员)时,它很冗长. 这里是最小的例子: #include struct base_pod { // functions like friend compare operator }; template struct de
..
C ++ 20采用了 p0960 -允许从带括号的值列表中初始化聚合。 确切的用词( [dcl.init] 17.6.2.2 )说: [...]构造函数是可行的,目标类型是聚合的 类,初始化程序是带括号的表达式列表, 对象的初始化如下。 让e 1 ,...,e n 成为合计([dcl.init.aggr])中的元素 。 让x 1 ,…,x k 成为表达式列表的元素。
..
请考虑以下示例: #include #include struct ABC { std :: string str; unsigned int id; / * = 0:错误:没有匹配的构造函数来初始化“ ABC” * / }; int main() { ABC abc {“ hi”,0}; std :: cout
..
C ++ 0x将使以下代码和类似代码格式错误,因为它需要 double narrowing conversion $ c>到 int 。 int a [] = {1.0}; 我想知道这种初始化在现实世界的代码中是否被大量使用。此更改将破坏多少代码?如果您的代码受到影响,是否需要花费很多精力在代码中进行修复? 作为参考,请参见8.5。 n3225的.4
..
我正在编写一个类,该类具有带const char*参数的显式构造函数.出于这个问题的意图和目的,它看起来像这样: struct Symbol { Symbol()=default; explicit Symbol(const char*); }; 现在,出于文档目的,我想编写一个示例来初始化数组(array/vector/list-我不在乎确切的类型),并且我需要使示例尽
..
考虑以下代码: #include struct A { int a; int b; }; static std::array x1 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; static std::array x2 =
..
假设我具有以下结构: struct sampleData { int x; int y; }; 使用时,我想初始化 sampleData 类型为已知状态。 sampleData样本= {1,2} 后来,我决定需要存储在 sampleData 结构中的其他数据,如下所示: struct sampleData { int
..
说我想引用我已经定义的initializer_list的成员.我可以吗? 此代码编译并给出预期的结果:我在Visual Studio和 gcc 中均给出了"13 55"只是想知道这是合法的: const int foo[2] = {13, foo[0] + 42}; 解决方案 所以我们这里是C ++标准草案的8.5.1部分所涉及的聚合初始化,它说: 集合是数组或类[...]
..
假设我有一个类型,并且想将其默认构造函数设为私有.我写以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a privat
..