考虑这段代码:
template <typename T>
void f()
{T x = T();}
什么时候T = int
,x
等于0
或等于任意值?
额外的问题:因此,数组(T[N]
和std::array<T, N>
)是唯一一种这样的语法可能会留下具有任意值的内容的类型。
考虑这段代码:
template <typename T>
void f()
{T x = T();}
什么时候T = int
,x
等于0
或等于任意值?
额外的问题:因此,数组(T[N]
和std::array<T, N>
)是唯一一种这样的语法可能会留下具有任意值的内容的类型。
T()
给出值初始化,它对类、联合或数组以外的类型进行零初始化。(§8.5/7 项目符号 3):“否则,对象被零初始化。” 对于数组,数组的每个元素都是值初始化的。
对于数组,如果它是自动存储类,则内容将是任意值,但如果它是静态存储类,则初始化为零——即全局(当然,假设您没有指定任何初始化)。
关于你的第一个问题,它被称为value-initialization,并且在标准中得到了很好的介绍(C++11 § 8.5 详细介绍了初始化,详细说明了()
初始化以及它最终如何导致零初始化,从 8.5 开始/16(覆盖()
),这导致 8.5/7(值初始化),最后是 8.5/5(零初始化)。
关于std::array<T,N>
,如果T
是类类型,构造函数将为每个元素触发(用户提供或默认,如果用户没有提供)。如果默认构造发生,默认初始化将触发(这不是很令人兴奋)。按照标准 (8.5/6),每个元素都是默认初始化的。因为T
那不是一个类类型,这实际上与T ar[N];
您所指出的相同,也是不确定的(因为它是默认初始化的,按照标准“不执行初始化”。
最后,如果为非类类型的固定数组声明了静态存储,则它在开始时驻留在零填充内存中。对于自动存储,它回到“不执行初始化”。作为你的最终游戏。
我希望我没有错过任何东西(我知道如果我错过了我会听到的)。SO上有很多有趣的问题,涵盖了这样的领域。如果有机会我会链接一些。