14

在 2003 年 - 是的,2003 年- Vandervoorde 和 Josuttis 在他们的书“C++ 模板”(第 40 页)中写道:

不能使用浮点文字(和简单的常量浮点表达式)作为模板参数是有历史原因的。因为没有严重的技术挑战,这可能会在未来的 C++ 版本中得到支持。

但这仍然不起作用,即使在 C++11 下:

template<double D> //error
void foo() {}

为什么没有添加这个?

4

3 回答 3

11

我一直认为这与相互匹配的实现有关。就像这两个实例相同或不同:

template class foo<10./3.>
template class foo<1./3 * 10.>

它们可能不会生成相同的双精度表示,因此编译器可能会将它们视为不同的类。然后你不能将它们分配给彼此,等等。

于 2013-07-18T15:25:23.387 回答
8

让我们看看下面的代码:

template<double D> int f(){
  static int i=0; 
  ++i; 
  return i;
}

...

#define D1=...
#define D2=...
cout << f<D1>()<<endl; // returns 1
cout << f<D1-D2+D2>()<<endl; // may return 1 or 2, depending on many things

看,对于某些值D1-D2+D2可能等于,D1但对于其他值不等于。

更重要的是 - 它们可能相等或不取决于舍入设置

最后,它们可能相等或不相等,具体取决于编译器/架构/许多其他事物。

关键是,浮点运算对于模板的使用定义得不够好(它们定义得很好,但是根据不同的选项有很多可能的差异)

于 2013-07-18T15:31:50.900 回答
6

使用浮点数时,舍入和相等存在很多问题。从规范化委员会的角度来看,您需要确保两个程序在多个编译器上执行相同的操作。因此,您需要非常精确地指定浮点运算的结果。可能他们觉得 IEEE-754 规范不够精确……

所以这不是它是否可以实现的问题,而是我们想要拥有什么样的精确行为的问题。

但是请注意,constexpr接受浮点值。这通常足以进行编译时计算。

于 2013-07-18T15:26:06.167 回答