7

我有一个静态 const 成员,想将其设置为最大整数。我正在尝试以下操作:

const static int MY_VALUE = std::numeric_limits<int>::max();

但是得到以下错误:

错误:静态数据成员的类内初始化程序不是常量表达式

有什么解决办法吗?函数如何返回常量表达式?

编辑:添加 -std=c++11 解决了这个问题。我的室友告诉我,编译器(C++11 之前)不够聪明,无法决定 std::numeric_limits::max() 不会改变其他任何东西,因此不被认为是常量。这可能是这个错误的原因吗?

4

3 回答 3

1

常量必须从常量表达式(在编译时可评估的表达式)初始化。

在 C++03 中,可以用来构建常量表达式的常量操作集非常紧凑。只有裸积分和数学运算。

为了在常量表达式中使用用户定义的函数,您需要:

  • C++11 或更高版本
  • 表示要标记的功能constexpr

这就是为什么将-std=c++11标志添加到 Clang 有帮助的原因:它允许constexpr并“切换”到改进的标准库实现,它constexpr使用std::numeric_limits<T>::max().

注意:如果您使用更新版本的 Clang,C++11 将是默认的,并且不需要任何标志来允许constexpr.

于 2016-02-20T15:30:48.273 回答
1

像这样:

#include <climits>
const static int MY_VALUE = INT_MAX;
于 2016-02-20T16:40:54.860 回答
0

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

如果在程序中使用该成员,则该成员仍应在名称空间范围内定义,并且名称空间范围定义不应包含初始值设定项。

numeric_limits max()不是整数常数,而是编译时间常数。

于 2016-02-20T09:42:05.007 回答