【发布时间】:2019-02-05 05:41:57
【问题描述】:
以下按预期工作:
#include <array>
constexpr std::array<int, 3> values = {1, 2, 3};
template <int i> struct A { static constexpr int val = values[i]; };
int main() { A<1> a; }
但是,如果我们使用values.size() 作为模板参数,我会从 MSVC 编译器中得到一个编译器错误:
int main() { A<values.size()> a; }
错误是表达式未计算为常量。 GCC 编译没有错误。
- 这是 MSVC 编译器的错误吗?
- 是否有标准/巧妙的解决方法来规避此错误?
【问题讨论】:
-
哪个版本的 MSVC?
-
版本“x64 msvc v19.16”,见godbolt.org/z/fwpIAH
-
解决方法很简单,不是吗?
int main() { A<3> a; } -
顺便说一句,我可能会更改标题,这里没有单个编译器错误,那么为什么要“另一个”? ;)
-
我改了标题。由于 GCC 会编译而 MSVC 不会,“编译器错误?”看起来很合适。