1

考虑这段代码:

template <typename T>
void f()
{T x = T();}

什么时候T = intx等于0或等于任意值?

额外的问题:因此,数组(T[N]std::array<T, N>)是唯一一种这样的语法可能会留下具有任意值的内容的类型。

4

2 回答 2

3

T()给出值初始化,它对类、联合或数组以外的类型进行零初始化。(§8.5/7 项目符号 3):“否则,对象被零初始化。” 对于数组,数组的每个元素都是值初始化的。

对于数组,如果它是自动存储类,则内容将是任意值,但如果它是静态存储类,则初始化为零——即全局(当然,假设您没有指定任何初始化)。

于 2013-08-18T04:27:20.087 回答
2

关于你的第一个问题,它被称为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上有很多有趣的问题,涵盖了这样的领域。如果有机会我会链接一些。

于 2013-08-18T04:42:06.463 回答