带默认值的结构体的大括号(聚合)初始化
Brace (aggregate) initialization for structs with default values
用默认值初始化一个结构体是微不足道的:
struct X { int a; int b = 2; };
和使用大括号初始化器初始化结构体也很简单:
X x = {1, 3};
令人惊讶的是,init代码不会编译,直到我删除默认值。那么,在这种情况下我该如何进行init呢?我想保持X的POD没有c-tor
下面是一些与这个问题相关的文档:
http://en.cppreference.com/w/cpp/language/aggregate_initialization在c++11中你的代码是无效的。在c++14中,它再次有效。
在c++ 11中,添加一个默认初始化可以防止带括号的init生效。在c++ 14中,它不需要。
在c++ 11中解决这个问题的一种方法是编写一个构造函数,其中A的值和b的值具有默认值。
相关文章:
- 同时具有"聚合初始化"和"模板推导"
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 聚合初始化,将成员指针设置为同一结构成员
- 是否可以防止省略聚合初始化成员?
- 直接初始化不可复制、不可移动的成员,而不使用聚合初始化
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 将初始化器列表/聚合初始化转发到 std::array 成员
- 隐藏用于聚合初始化的空基类
- 枚举位域和聚合初始化
- 具有聚合初始化的指针容器
- 不可复制基类的聚合初始化
- std::数组派生类聚合初始化
- 为什么数组的 GCC 聚合初始化首先用零填充整个事物,包括非零元素?
- 聚合初始化,clang想让我破坏代码吗
- 具有聚合初始化的C++常量匿名实例
- 聚合初始化中出现异常
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- C++17 之前的聚合初始化
- 结构 + initializer_list 的聚合初始化:新与静态
- 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?