c++ - 如何使用列表初始化对聚合类型进行值初始化

标签 c++ c++14 value-initialization list-initialization aggregate-initialization

如何使用列表初始化语法对 C++14 中的聚合类型进行值初始化?

Aggregate_t {}; 

这被视为聚合初始化,它会对 Aggregate_t 的未初始化成员产生错误或警告。

这可能吗?

编辑:示例

struct Aggregate_t {
  int x;
};

int main (int, char**)
{
  Aggregate_t {};
  return 0;
}

使用 g++-4.9.2 编译:

main.c++: In function ‘int main(int, char**)’:
main.c++:7:16: warning: missing initializer for member ‘Aggregate_t::x’ [-Wmissing-field-initializers]
   Aggregate_t {};
            ^

最佳答案

[dcl.init.aggr]:

7 - If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized [C++14: from its brace-or-equal-initializer or, if there is no brace-or-equal-initializer,] from an empty initializer list (8.5.4).

所以 g++ 的警告过于热心了;我不知道有什么方法可以避免它,同时在警告有效的情况下保留它,当然除了使用带有预期复制省略的复制初始化:

Aggregate_t a = Aggregate_t();

关于c++ - 如何使用列表初始化对聚合类型进行值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28675429/

相关文章:

c++ - 派生类中的静态方法可以调用 C++ 中的 protected 构造函数吗?

c++ - try catch 异常处理 C++

c++ - 可变参数模板和构造函数

c++ - 将自己的大小插入到 std::map

c++ - 我可以在默认初始化和值初始化之间或数组的全部或部分之间进行选择吗?

c++ - 原始数据类型在循环内分配了多少次?

C++ 代码出现段错误,我不知道为什么

c++ - 如何使用模板将变量传递给具有任何签名的函数?

c++ - sizeof 运算符生成的数据类型

c++ - 从有符号字符到整数的值初始化,过早提升?