对于C ++中的泛型类型,默认构造函数是否表示零

时间:2019-05-24 10:22:30

标签: c++ c++11 visual-studio-2010

假设有一个功能可以正常工作

template <typename T> 
Range<T> IRange(T lower, T upper){
  ....
}

所以

IRange(0,5)

将产生一个值为[0,1,2,3,4]的RangeRange类的确切行为并不重要。

但是现在我想要一个辅助功能

template <typename T> 
Range<T>
Repeat(T t){
    return IRange(T(), t);
}

这样

Repeat(5)

还将产生一个值为[0,1,2,3,4]的Range

问题是:

  

一般来说,使用T()来获取值是可以的吗?

我是这样认为的,但有些something恼我可能是错的。

大多数情况下,此类将与 integer 类型一起使用,但其他适合该概念的其他类型也应适用。

2 个答案:

答案 0 :(得分:3)

如果Tint,则

int i = int(); 

value-initializes i,对于int来说,它初始化为零,因此它保持值为0。(请注意,此语法不需要内置类型的构造函数,例如为int。)

通常,T()是值初始化,并且值取决于T的定义如下:

  

The effects of value initialization are:

     

1)如果T是具有至少一个用户提供的任何类型的构造函数的类类型,则调用默认构造函数; (直到C ++ 11)
  1)如果T是没有默认构造函数或带有用户提供或删除的默认构造函数的类类型,则该对象将被默认初始化; (自C ++ 11起)
  2)如果T是没有用户提供的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都将被值初始化; (直到C ++ 11)
  2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是未删除的(也就是说,它可能是带有隐式定义或默认默认构造函数的类),则将该对象初始化为零,然后将其如果具有非平凡的默认构造函数,则默认初始化; (自C ++ 11起)
  3)如果T是数组类型,则数组的每个元素都将值初始化;   4)否则,该对象将被初始化为零。

答案 1 :(得分:0)

  

对于C ++中的泛型类型,默认构造函数是否表示零?

不,这显然不是一般情况,例如为std::vector<char>()

但是,您需要考虑约束条件或等效概念。您的功能TIRange对哪些概念性Repeat类型有意义?从您撰写的内容来看,似乎很明显这些类型在概念上必须是数字。

C ++尚无此类概念的正式定义(C ++ 20会有所收获),但是为数字类型定义即席概念相对来说是简单的(这里是重要的细微之处)通过基于int所做的事情。

出于您的目的,这使您完全可以理解P.W的答案:对于数字类型,T()identity under addition(又名0)的理想选择。等效地,您可以使用“统一”初始化 1 T{},有些人尤其喜欢通用代码。


1 不幸的是,“uniform initialisation” isn’t,但您可以忽略此情况。