int()返回0还是任意值?

时间:2013-08-18 04:11:26

标签: c++ initialization default-constructor

考虑以下代码:

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

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

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

2 个答案:

答案 0 :(得分:3)

T()提供值初始化,它为类,联合或数组以外的类型提供零初始化。 (§8.5/ 7 bullet 3):“否则,对象是零初始化的。”对于数组,数组的每个元素都是值初始化的。

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

答案 1 :(得分:2)

关于你的第一个问题,它被称为 value-initialization ,并在标准中得到了很好的介绍(C ++11§8.5详细介绍了初始化,详见{{1}初始化以及它最终如何导致零初始化,从8.5 / 16开始(覆盖()),这导致8.5 / 7(值初始化),最后是8.5 / 5 (零初始化)。

关于(),如果std::array<T,N>是类类型,则构造函数将为每个元素触发(用户提供的或默认情况下,如果用户不提供)。如果默认构造发生默认 - 初始化将触发(这不是非常令人兴奋)。根据标准(8.5 / 6),每个元素都是默认初始化的。对于不是类的T类,这实际上与T相同,正如您所指出的那样,它也是不确定的(因为它是默认初始化的,通过标准“不进行初始化。”。

最后,如果为非类型的固定数组声明静态存储,则它在初始时驻留在零填充内存中。对于自动存储,返回“不执行初始化”。作为你的最终游戏。

我希望我没有错过任何东西(我知道如果我这样做,我会听到它)。 SO上有很多有趣的问题,涵盖了这样的领域。如果我有机会,我会链接一些。