0

考虑这个函数:

template <typename T>
T foo(const T& var = T()) {
  return var;
}

这个调用显然是安全的:

foo<std::string>()

是那些?

foo<int>()
foo<bool>()
...
4

1 回答 1

2

是的,它们非常好。表单的表达式T()创建一个类型的对象T并对其进行值初始化。int对or进行值初始化bool与对它们进行零初始化相同。也就是说,参数var的值为 0。

表达式T(), 其中是非数组完整对象类型T简单类型说明符或类型名称说明[...] 创建指定类型的纯右值,其值是值初始化 (8.5) 对象产生的值类型T

值初始化定义为:

对类型对象进行值初始化T意味着:

  • ifT是(可能是 cv 限定的)类类型 [...]

  • ifT是(可能是 cv 限定的)非联合类类型 [...]

  • 如果T是数组类型,[...]

  • 否则,对象被零初始化。

零初始化定义为:

对类型的对象或引用进行零初始化T意味着:

  • 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T

  • [...]

由创建的临时对象T()然后绑定到const引用,这延长了它的生命周期。

在两种情况下,临时对象在与完整表达式结束时不同的点被销毁。[...]第二个上下文是引用绑定到临时的。

于 2013-04-08T12:09:18.553 回答