为什么 MSVC 说对虚拟 constexpr 函数调用运算符的调用不会产生常量表达式?

sax*_*one 5 c++ visual-c++ compiler-bug constexpr c++20

我有一个包装数组的类。它继承自一个抽象基类,virtual constexpr为函数调用运算符定义一种方法。在子类中,我重写所述方法并访问内部数组:

\n
#include <cstddef>\n#include <array>\n#include <initializer_list>\n\ntemplate <typename T, std::size_t N>\nclass ContainerBase {\npublic:\n    virtual constexpr const T& operator()(std::size_t i) const = 0;\n};\n\ntemplate <typename T, std::size_t N>\nclass Container : public ContainerBase<T, N> {\npublic:\n    constexpr Container(std::initializer_list<T> data) {\n        std::copy(data.begin(), data.end(), _items.begin());\n    }\n    constexpr const T& operator()(std::size_t i) const override {\n        return _items[i];\n    }\nprivate:\n    std::array<T, N> _items;\n};\n\nint main () {\n    constexpr Container<int, 3> C = {2, -91, 7};\n    constexpr int F = C(1);\n\n    static_assert(F == -91);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是Godbolt 链接

\n

据我所知,这都是 C++20 中的合法代码,它允许virtual constexpr. G++ 10.3 和 Clang 12 都接受它作为有效代码,但是 MSVC 19.33 不接受它,声称该变量F不是常量表达式:

\n
msvc_buggy_constexpr.cpp(29,21): error C2131: expression did not evaluate to a constant\nmsvc_buggy_constexpr.cpp(21,16): message : a non-constant (sub-)expression was encountered\nmsvc_buggy_constexpr.cpp(31,5): error C2131: expression did not evaluate to a constant\nmsvc_buggy_constexpr.cpp(21,16): message : a non-constant (sub-)expression was encountered\n
Run Code Online (Sandbox Code Playgroud)\n

是什么赋予了?对我来说,这看起来像是 MSVC 中的编译器错误。我会进一步调查,但 godbolt.org 上的 MSVC 现在似乎已关闭。

\n

我应该补充一点,只有当函数调用运算符方法是virtual\xe2\x80\x94 时,问题才会出现;如果不是,则不会出现该问题。

\n

有人可以建议吗?

\n

sax*_*one 2

用户 @Barry 同意我的观点,这绝对是 MSVC 中的一个错误。

我已经提交了这个错误报告

希望问题尽快得到解决。

感谢大家的评论和进一步的见解,这非常有帮助!