0

以下是不允许的('std::numeric_limits::max()' 不能出现在常量表达式中):

#include <limits>   

struct MyStruct {

private:  
  static const unsigned int INVALID_VALUE = std::numeric_limits<unsigned int>::max();

public:
  unsigned int index;

  inline MyStruct() : index(INVALID_VALUE) {}
};

这可能是获得所需行为的最佳方式?如果可能的话,我希望在编译时知道 INVALID_VALUE(例如,允许编译器进行更好的优化)。

4

4 回答 4

2

您可以使用UINT_MAXfrom<climits>代替。

或者,您可以提供一个定义:

struct MyStruct 
{
private:
  static const unsigned int INVALID_VALUE;
};

const unsigned int MyStruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

或者,切换到函数所在的 C++11,constexpr这样就可以了。

于 2013-08-16T11:59:51.937 回答
1

如何将您的常量定义为 ~0U. 由于unsigned int被定义为“直接二进制表示”,因此其逆应为所有位设置。

于 2013-08-16T11:59:19.283 回答
1

在 C++11 或更高版本中,这应该没问题,因为numeric_limits现在声明了函数constexpr

如果你被困在过去,那么你需要在类外定义和初始化常量:

// Header file
struct MyStruct {
    static const unsigned int INVALID_VALUE;
    // ...
};

// One source file
const unsigned int Mystruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

或者,您可以使用UINT_MAX定义在<climits>. 这样做的好处是您的常量可以在常量表达式中使用。

于 2013-08-16T12:01:05.810 回答
0

添加:

const unsigned int mystruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

在 cpp 文件的某处,这是初始化静态成员的正常方法。

于 2013-08-16T12:00:29.133 回答