在常量表达式中使用numeric_limits :: max()

Fir*_*his 29 c++ std numeric-limits constexpr

我想在类中定义一个常量,该值是最大可能的int.像这样的东西:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}
Run Code Online (Sandbox Code Playgroud)

此声明无法使用以下消息进行编译:

numeric.cpp:8:错误:"的std :: numeric_limits :: MAX()"不能出现在一个常数表达式numeric.cpp:8:错误:一个函数调用不能出现在一个常数表达式

我理解为什么这不起作用,但有两件事对我来说很奇怪:

  1. 在我看来,在常量表达式中使用该值是一个自然的决定.为什么语言设计者决定使max()成为一个函数,从而不允许这种用法?

  2. 该规范在18.2.1中声称

    对于在numeric_limits模板中声明为static const的所有成员,特化应以这样的方式定义这些值,使它们可用作整型常量表达式.

    这不是说我应该能够在我的场景中使用它而不是它与错误信息相矛盾吗?

谢谢.

Unc*_*ens 17

看起来有点缺陷......

在C++ 0x中,numeric_limits将标记所有内容constexpr,这意味着您将能够使用min()max()作为编译时常量.


Geo*_*che 16

虽然目前的标准缺乏支持,但对于整数类型,Boost.IntegerTraits为您提供了编译时常量const_minconst_max.

问题来自§9.4.2/ 4:

如果静态数据成员是const integer或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19).在这种情况下,成员可以出现在整数常量表达式中.

请注意,它添加:

如果在程序中使用该成员,并且名称空间作用域定义不包含初始化程序,则该成员仍应在名称空间作用域中定义.

正如其他人已经提到numeric_limit的那样,min()并且max()它们不是整数常量表达式,即编译时间常数.


小智 14

你要:

#include <limits>

struct A {
static const int ERROR_VALUE;
}; 

const int A::ERROR_VALUE = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)

将类/结构放在标题中,将定义放在.cpp文件中.

  • @aaa它不能:( (3认同)
  • 可以将上面定义的ERR_VALUE用作模板参数吗? (2认同)
  • 类和外部初始化有什么区别?我知道我可以使用整数值初始化类中的consts.另外,我必须至少有一个这样的类的实例,对吗?否则编译器可能决定不初始化它? (2认同)