C++ C++;使用值初始化聚合类型的std::数组

C++ C++;使用值初始化聚合类型的std::数组,c++,c++11,initialization,stdarray,C++,C++11,Initialization,Stdarray,我想知道如何初始化结构的N元素std::数组 例如: struct SomeStruct { uint32_t * const entry1; uint16_t * const entry2; uint16_t * const entry3; }; 可以通过以下方式进行初始化: static const std::array<SomeStruct , 2> arr {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr

我想知道如何初始化结构的N元素std::数组

例如:

struct SomeStruct {
  uint32_t * const entry1;
  uint16_t * const entry2;
  uint16_t * const entry3;
};
可以通过以下方式进行初始化:

static const std::array<SomeStruct , 2> arr
{nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
// nullptr just for example, would be addresses of real variables in the project
静态常量std::数组arr
{nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
//例如,nullptr就是项目中实变量的地址
但这并不完全是我所需要的,因为下面的语句在没有任何警告或其他内容的情况下也能正常工作,因此使元素默认处于初始化状态

static const std::array<SomeStruct , 2> arr
{nullptr, nullptr, nullptr, nullptr};
静态常量std::数组arr
{nullptr,nullptr,nullptr,nullptr};
我需要的是对编译器进行一次强有力的检查,检查是否所有元素都已初始化,语法如下:

static const std::array<SomeStruct , 2> arr
{{nullptr, nullptr, nullptr}, {nullptr, nullptr, nullptr}};
静态常量std::数组arr
{{nullptr,nullptr,nullptr},{nullptr,nullptr,nullptr};

是否有可能强制C++检查AGGRGET类型的所有元素要初始化?

加油

但这并不完全是我所需要的,因为下面的语句在没有任何警告或其他内容的情况下也能正常工作,因此使元素默认处于初始化状态

static const std::array<SomeStruct , 2> arr
{nullptr, nullptr, nullptr, nullptr};
它不会使元素默认处于初始化状态。CPP参考,重点是我的:

如果初始值设定项子句的数量小于成员的数量或初始值设定项列表完全为空,则剩余的成员将值初始化。如果引用类型的成员是这些剩余成员中的一个,则程序的格式不正确

确切的措辞在C++11中发生了更改,但不会影响您的案例

因此,如果您想将all初始化为nullptr,只需使用

static const std::array<SomeStruct , 2> arr{};
但这并不完全是我所需要的,因为下面的语句在没有任何警告或其他内容的情况下也能正常工作,因此使元素默认处于初始化状态

static const std::array<SomeStruct , 2> arr
{nullptr, nullptr, nullptr, nullptr};
它不会使元素默认处于初始化状态。CPP参考,重点是我的:

如果初始值设定项子句的数量小于成员的数量或初始值设定项列表完全为空,则剩余的成员将值初始化。如果引用类型的成员是这些剩余成员中的一个,则程序的格式不正确

确切的措辞在C++11中发生了更改,但不会影响您的案例

因此,如果您想将all初始化为nullptr,只需使用

static const std::array<SomeStruct , 2> arr{};

您可以使用
std::make_array
static_assert
生成的类型。然而,
std::make_array
只是一个建议,但有一个参考实现

名称空间详细信息{
模板结构是\u ref\u包装器:std::false\u type{};
模板结构是\u ref\u包装器:std::true\u type{};
模板
使用not_ref_wrapper=std::experional::negation;
模板结构返回\u type\u helper{using type=D;};
模板
结构返回\u类型\u帮助程序:std::common\u类型{
静态断言(std::实验::连接),
“当D为空时,类型不能包含引用_包装”);
};
模板
使用return_type=std::array;
}
模板<类别D=无效,类别。。。类型>
constexpr详细信息::返回类型生成数组(类型&&…t){
返回{std::forward(t)…};
}

您可以使用
std::make_array
static_assert
作为结果类型。然而,
std::make_array
只是一个建议,但有一个参考实现

名称空间详细信息{
模板结构是\u ref\u包装器:std::false\u type{};
模板结构是\u ref\u包装器:std::true\u type{};
模板
使用not_ref_wrapper=std::experional::negation;
模板结构返回\u type\u helper{using type=D;};
模板
结构返回\u类型\u帮助程序:std::common\u类型{
静态断言(std::实验::连接),
“当D为空时,类型不能包含引用_包装”);
};
模板
使用return_type=std::array;
}
模板<类别D=无效,类别。。。类型>
constexpr详细信息::返回类型生成数组(类型&&…t){
返回{std::forward(t)…};
}

如果你这样做,你实际上可以让列表为空,所有元素都将默认初始化。为了澄清我以前的评论,编译器在遵循C++规范时允许你在初始化中使用更少的成员或元素,并且不需要警告它。如果您想要强制所有元素和所有成员的显式初始化,那么您可能应该使用一个静态分析器,它可以检测到这一点并给出警告。您使用的编译器是什么?你确定没有一个可选的警告吗?如果你真的可以让列表为空,所有元素都将默认初始化。为了澄清我以前的评论,编译器在遵循C++规范时允许你在初始化中使用更少的成员或元素,并且没有必要对此进行警告。如果您想要强制所有元素和所有成员的显式初始化,那么您可能应该使用一个静态分析器,它可以检测到这一点并给出警告。您使用的编译器是什么?你确定没有可选的警告吗?