我可以强制执行标量类型通过 int{} 初始化为零吗?

Can I enforce scalar types to be initialized to zero by int{}?

本文关键字:初始化 int 标量 强制执行 类型 我可以      更新时间:2023-10-16

请考虑以下代码:

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

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

但是,如果T是,例如,int,那么它将在此处取消初始化。好吧,int直观的"默认初始化"应该意味着它应该初始化为零。

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

这行得通吗?

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

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

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

对于具有默认构造函数的类

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

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

Justin 已经在注释中挖掘了正确的引用(称为零初始化),所以是的,这适用于所有类和非类类型。不仅是整数类型,还有布尔值、浮点类型和指针。

虽然它对someFun<void>()不起作用,但我想说该功能缺乏乐趣。