考虑这个函数:
template <typename T>
T foo(const T& var = T()) {
return var;
}
这个调用显然是安全的:
foo<std::string>()
是那些?
foo<int>()
foo<bool>()
...
是的,它们非常好。表单的表达式T()
创建一个类型的对象T
并对其进行值初始化。int
对or进行值初始化bool
与对它们进行零初始化相同。也就是说,参数var
的值为 0。
表达式
T()
, 其中是非数组完整对象类型T
的简单类型说明符或类型名称说明符[...] 创建指定类型的纯右值,其值是值初始化 (8.5) 对象产生的值类型T
值初始化定义为:
对类型对象进行值初始化
T
意味着:
if
T
是(可能是 cv 限定的)类类型 [...]if
T
是(可能是 cv 限定的)非联合类类型 [...]如果
T
是数组类型,[...]否则,对象被零初始化。
零初始化定义为:
对类型的对象或引用进行零初始化
T
意味着:
如果
T
是标量类型(3.9),则将对象设置为值0
(零),作为整数常量表达式,转换为T
;[...]
由创建的临时对象T()
然后绑定到const
引用,这延长了它的生命周期。
在两种情况下,临时对象在与完整表达式结束时不同的点被销毁。[...]第二个上下文是引用绑定到临时的。