【问题标题】:Does int() return 0 or an arbitrary value?int() 返回 0 还是任意值?
【发布时间】:2013-08-20 04:13:59
【问题描述】:

考虑这段代码:

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

T = int 时,x 是否等于0 或任意值?

额外问题:因此,数组(T[N]std::array&lt;T, N&gt;)是仅有的此类语法可能会留下具有任意值的内容的类型。

【问题讨论】:

  • 0。但是,int x; 未定义。
  • 关于std::array&lt;T,N&gt;,您可以使用通用初始化对它们进行值初始化。 IE。 std::array&lt;int,5&gt; data{};,但你是对的,就像固定数组一样,它们是不确定的,没有一些类型的初始值(这种方式或直接)。

标签: c++ initialization default-constructor


【解决方案1】:

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

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

【讨论】:

  • 并且T x{}; 代替T x = T(); 是否可以解决所有类型的问题(无论T 是什么,都没有任意值)?
  • @Vincent:是的,T x{}; 应该始终给出一个值初始化对象(§8.5.1/7):“如果列表中的初始化子句少于聚合中的成员数,那么每个没有显式初始化的成员都应该从一个空的初始化列表中初始化”。
  • @Vincent、x()x{} 在构造函数初始化列表中也会对数组进行值初始化。
【解决方案2】:

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

关于std::array&lt;T,N&gt;,如果T 是类类型,则构造函数将为每个元素触发(用户提供或默认,如果用户未提供)。如果默认构造发生,默认初始化将触发(这不是很令人兴奋)。按照标准 (8.5/6),每个元素都是默认初始化的。对于T不是一个类类型,这实际上与T ar[N]; 相同,正如您所指出的,它也是不确定的(因为它是默认初始化的,按照标准“不执行初始化。”。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多