为什么std::numeric_limits<T>::max()是一个函数?

31
在C++标准库中,值std::numeric_limits::max()被指定为函数。特定类型的其他属性被作为常量给出(例如std::numeric_limits::is_signed)。所有类型为T的常量均被视为函数,而所有其他常量均被视为常数值。这样做的原因是什么?

3
http://www.archivum.info/comp.lang.c++/2010-01/01066/numeric_limits-lt-gt-::max%28%29.html - anon
max不是常量,可能会随编译器标志而变化。 - Martin York
3
@Martin:我不明白那有什么关系。毕竟,编译器标志只需要控制常量如何初始化即可。 - jalf
@jalf:作为实现细节,你是正确的,函数和变量没有区别。但是通过使用函数,你暗示这些信息不是恒定的,而是被计算出来的(即使它是一个常量表达式)。我喜欢这种区分,因为信息就是力量。 - Martin York
参见:https://dev59.com/kXE85IYBdhLWcg3whD3j - Rob Kennedy
1个回答

20

继承Neil的评论,std::numeric_limit<T>适用于任何数字类型,包括浮点数,如果您深入研究comp.lang.c++线程,您会看到提到可能无法为浮点值定义静态变量。

因此,为了保持一致性,他们决定将整数和浮点数都放在方法后面。

这将在C++0x中改变,所以有希望。


现在我真的很好奇为什么不能定义一个浮点数静态变量。你能详细解释一下吗? - MicroVirus
1
@MicroVirus:哦天啊...我不能保证这就是我六年前(至今)所想的...但我会赌在浮点数舍入模式上。如果你想将浮点文字0.0123456789存储在ROM中,编译器必须将其解释为实际的floatdouble值...但它应该如何舍入结果呢?它无法预测运行时将使用哪种舍入模式!C++11定义了哪些舍入模式会影响什么以及它们不会影响什么,从而使得可以对浮点数进行可移植的静态初始化。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接