用const数组元素初始化

时间:2014-11-30 18:41:48

标签: c++ arrays templates visual-c++ const

为什么编译器(VC ++)不允许(错误C2975)

const int HASH[] = {24593, 49157};
bitset<HASH[0]> k;

我该怎么做才能克服这个问题(用数组中的常量值初始化模板)?

1 个答案:

答案 0 :(得分:3)

本地const对象不能作为常量表达式,但std::bitset<N>要求非类型模板参数N为常量表达式。具有初始值设定项的const整数对象确实有资格作为常量表达式。在所有其他情况下,您需要constexpr(我不知道MSVC ++是否支持constexpr)。例如:

#include <bitset>

struct S { static int const member = 17; };
int const global_object = 17;
int const global_array[]  = { 17, 19 };
int constexpr global_constexpr_array[] = { 17, 19 };

int main()
{
    int const local = 17;
    int const array[] = { 17, 19 };
    int constexpr constexpr_array[] = { 17, 19 };

    std::bitset<S::member> b_member; // OK

    std::bitset<global_object>             b_global;                 // OK
    std::bitset<global_array[0]>           b_global_array;           // ERROR
    std::bitset<global_constexpr_array[0]> b_global_constexpr_array; // OK

    std::bitset<local>              b_local;           // OK
    std::bitset<array[0]>           b_array;           // ERROR
    std::bitset<constexpr_array[0]> b_constexpr_array; // OK
}

所有这一切,你确定你真的想拥有一个std::bitset<N>数组指定的元素数量吗?如果你真的对价值的某些部分感兴趣,你宁愿使用这样的东西:

std::bitset<std::numeric_limits<unsigned int>::digits> k(HASH[0]);