带有 constexpr 声明变量的奇怪错误 C2131

Posted

技术标签:

【中文标题】带有 constexpr 声明变量的奇怪错误 C2131【英文标题】:Weird error C2131 with constexpr declared variable 【发布时间】:2019-12-07 04:44:32 【问题描述】:

我正在尝试使用 VS2017 编译以下 sn-p,但它会抛出一个 error C2131: expression did not evaluate to a constant,而输出日志中没有任何进一步的详细信息。

class Example

public:
    constexpr Example() : m_int()
    
        for (int i = 0; i < 256; ++i)
        
            for (int j = 0; j < 256; ++j)
            
                m_int[i] = i;
            
        
    

private:
    int m_int[256];
;

int main()

    constexpr Example vv; // <-- error C2131 here
    return 0;

但是由于某些我不知道的原因,如果我将 j 计数器停在 &lt; 255(而不是 256),代码编译得很好。 这背后的解释是什么,我该如何解决?

【问题讨论】:

看不到任何明显的错误,所以这看起来像一个编译器错误。 gcc 编译上面没有任何问题。 用MSVC编译很好 我刚刚找到解决方案,我会马上发布答案,谢谢! 内循环有什么作用?它只是一遍又一遍地分配给同一个元素。 【参考方案1】:

进一步搜索使我找到了以下link,在对参数值进行了一些试验和错误之后,我找到了解决方案。

/constexpr:steps10000000 添加到 C++ 编译器设置中的项目附加选项已修复错误,现在可以正常编译。我希望 VS2017 在这种情况下会抛出错误 C4593 而不是 C2131,因为它会让我头疼!

【讨论】:

以上是关于带有 constexpr 声明变量的奇怪错误 C2131的主要内容,如果未能解决你的问题,请参考以下文章

带有setter的constexpr成员变量?

在另一个函数中前向声明“constexpr”函数——编译器错误?

带有clang的C大数组中的奇怪分段错误

constexpr:确定性的常量优化

Constexpr变量不是编译时间值吗?

函数内的静态 constexpr 变量是不是有意义?