【问题标题】:Can I enforce scalar types to be initialized to zero by int{}?我可以强制通过 int{} 将标量类型初始化为零吗?
【发布时间】:2017-10-30 18:33:11
【问题描述】:

考虑以下代码:

template<class T>
void someFun() {
    T t;
    // stuff with t
}

在这里我可以确定,如果T 是可默认构造的structclass,那么t 应该被初始化为其默认值。

但是,例如,如果Tint,那么它将在此处未初始化。嗯,int 的直观“默认初始化”应该意味着它应该被初始化为零。

如果T 是类类型,我正在寻找一种方法来调用T 的默认构造函数,如果它是标量类型,则将其初始化为零。

这行得通吗?

template<class T>
void someFun() {
    T t{};
    // stuff with t
}

AFAIK 在上面的示例中,如果 T 是类类型,则将调用其默认构造函数,但如果它是 int 或其他标量类型,我可以确定它为零吗?

【问题讨论】:

  • 我 99% 确定答案是肯定的。至少,我知道 int foo = {} 将其初始化为 0。正在搜索源...
  • “这行得通吗?”嗯,你试过了吗?成功了吗?
  • @DimChtz 这在 C++ 中不太适用。它可能看起来很有效,但实际上并不有效
  • AFAIK, T t{}; 保证该值将是默认构造和初始化的,只要该类型存在默认构造,它适用于所有基本类型。

标签: c++ initialization default-constructor


【解决方案1】:

对于标量类型{},初始化器触发所谓的值初始化。而且,对于标量类型,值初始化会导致零初始化。所以,是的,它将对标量类型的对象进行零初始化。

对于具有默认构造函数的类类型,它还会触发值初始化,从而导致默认初始化(具有用户提供的默认构造函数的类)或零初始化(没有用户提供或删除的默认构造函数的类)。

因此,在您提到的所有情况下,它似乎都在执行您希望它执行的操作。

【讨论】:

  • 我认为这个问题也需要一些适用于非标量类型的东西,这在大多数情况下仍然有效。
  • 聚合初始化和往常一样不同:对于聚合的类类型,整个对象没有零初始化,也没有构造函数调用;相反,每个没有大括号或相等初始化器的非静态数据成员都被初始化为{}
【解决方案2】:

Justin 已经在 cmets 中挖掘了 the correct reference(称为零初始化),所以是的,这适用于所有类和非类类型。不仅是整型,还有布尔、浮点类型和指针。

虽然它不适用于someFun&lt;void&gt;(),但我想说这个功能没有乐趣。

【讨论】:

猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2019-05-02
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2017-09-15
  • 2012-01-18
相关资源
最近更新 更多