内置类型的模板参数默认值

时间:2013-04-08 12:06:49

标签: c++ templates

考虑这个功能:

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

这个电话显然是安全的:

foo<std::string>()

那些吗?

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

1 个答案:

答案 0 :(得分:2)

是的,他们完全没问题。表单T()的表达式创建了T类型的对象,并对其进行值初始化。初始化intbool的值与初始化它们相同。也就是说,参数var的值为0。

  

表达式T(),其中T简单类型说明符 typename-specifier ,用于非数组完整对象类型[...]创建指定类型的prvalue,其值是通过值初始化(8.5)T

类型的对象生成的

值初始化定义为:

  

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

     
      
  • 如果T是(可能是cv认证的)类类型[...]

  •   
  • 如果T是(可能是cv合格的)非联合类类型[...]

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

  •   
  • 否则,该对象为零初始化。

  •   

零初始化定义为:

  

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

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

  •   
  • [...]

  •   

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

  

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