c++初始化列表的元素比结构体少

C++ initializer lists with fewer elements than the struct

本文关键字:结构体 元素 初始化 列表 c++      更新时间:2023-10-16

当我使用初始化列表创建一个结构体,但初始化列表包含的元素比我的结构体少时,我看到其余的元素都用0初始化。

这是一个未定义的行为,我看到零,因为我的编译器(VS2015)决定为我零内存?

或者有人能告诉我在c++中解释这种行为的文档吗?

这是我的代码:

struct Thing {
    int value;
    int* ptr;
};

void main() {
    Thing thing { 5 };
    std::cout << thing.value << " " << thing.ptr << std::endl;
}

它打印的内容是:

5 00000000

最后一个元素是在没有初始化项的情况下被归零的元素

这是已定义的行为。根据聚合初始化规则,剩余成员ptr将被value-initialized,即0 -initialized为NULL指针。

(强调我的)

如果初始化子句的个数少于and bases (since C++17)的成员个数,或者初始化列表完全为空,则and bases (since C++17)的剩余成员按照通常的列表初始化规则(对非类类型和具有默认构造函数的非聚合类执行值初始化,对聚合类执行聚合初始化)由空列表初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)。如果引用类型的成员是这些剩余成员之一,则程序是病态的。