sax*_*one 5 c++ visual-c++ compiler-bug constexpr c++20
我有一个包装数组的类。它继承自一个抽象基类,virtual constexpr为函数调用运算符定义一种方法。在子类中,我重写所述方法并访问内部数组:
#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}\nRun Code Online (Sandbox Code Playgroud)\n这是Godbolt 链接。
\n据我所知,这都是 C++20 中的合法代码,它允许virtual constexpr. G++ 10.3 和 Clang 12 都接受它作为有效代码,但是 MSVC 19.33 不接受它,声称该变量F不是常量表达式:
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\nRun Code Online (Sandbox Code Playgroud)\n是什么赋予了?对我来说,这看起来像是 MSVC 中的编译器错误。我会进一步调查,但 godbolt.org 上的 MSVC 现在似乎已关闭。
\n我应该补充一点,只有当函数调用运算符方法是virtual\xe2\x80\x94 时,问题才会出现;如果不是,则不会出现该问题。
有人可以建议吗?
\n| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |