【问题标题】:How to set a const int to maximum in C++?如何在 C++ 中将 const int 设置为最大值?
【发布时间】:2016-06-01 23:15:56
【问题描述】:

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

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

但是得到以下错误:

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

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

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

【问题讨论】:

  • 什么编译器(或者更重要的是什么 C++ 头文件),什么选项?使用 std=c++11 为我工作。
  • 我目前正在使用 clang-700.1.81
  • -std=c+11编译?
  • 顺便说一下,MY_VALUE 对于不是宏的东西来说是个坏名字。将 ALL_CAPS 用于常量的概念在 C(常量使用宏)和 Java(没有宏)中是有意义的,但在 C++ 中只会带来麻烦。
  • @ChristianHackl MY_VALUE 只是这个问题的占位符

标签: c++ integer max constants numeric-limits


【解决方案1】:

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

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

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

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

这就是为什么在 Clang 中添加 -std=c++11 标志会有所帮助:它允许 constexpr 并“切换”到改进的标准库实现,该实现使用 constexpr 代替 std::numeric_limits&lt;T&gt;::max()

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

【讨论】:

    【解决方案2】:

    像这样:

    #include <climits>
    const static int MY_VALUE = INT_MAX;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 在 C++11 中,numeric_limits 的成员变成了constexpr,所以现在是常量。
      • @BoPersson 这意味着它们将能够用作编译时常量...我明白了
      猜你喜欢
      • 2013-10-31
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多