考虑这个功能:
template <typename T>
T foo(const T& var = T()) {
return var;
}
这个电话显然是安全的:
foo<std::string>()
那些吗?
foo<int>()
foo<bool>()
...
答案 0 :(得分:2)
是的,他们完全没问题。表单T()
的表达式创建了T
类型的对象,并对其进行值初始化。初始化int
或bool
的值与初始化它们相同。也就是说,参数var
的值为0。
表达式
类型的对象生成的T()
,其中T
是简单类型说明符或 typename-specifier ,用于非数组完整对象类型[...]创建指定类型的prvalue,其值是通过值初始化(8.5)T
值初始化定义为:
对
T
类型的对象进行值初始化意味着:
如果
T
是(可能是cv认证的)类类型[...]如果
T
是(可能是cv合格的)非联合类类型[...]如果
T
是数组类型,[...]否则,该对象为零初始化。
零初始化定义为:
对
T
类型的对象或引用进行零初始化意味着:
如果
T
是标量类型(3.9),则将对象设置为值0
(零),作为整数常量表达式,转换为T
[...]
然后T()
创建的临时对象绑定到const
引用,这延长了它的生命周期。
有两种情况下,临时表在与完整表达结束时不同的点被销毁。 [...]第二个上下文是指引用绑定到临时引用。