【发布时间】:2019-06-22 18:22:06
【问题描述】:
以下代码在 gcc 8.2 上编译,但在 icc 19.0.1 上编译失败:
#include <tuple>
template <typename Type, typename... TypeList>
constexpr size_t f(std::tuple<TypeList...> const &){
return 0;
}
template <typename Type, typename Tuple>
size_t g(Tuple && t){
static size_t constexpr v= f<Type>(t);
return v;
}
size_t h(){
std::tuple<int> tuple;
return g<int>(tuple);
}
我从 icc 收到的错误是:
error: expression must have a constant value
static size_t constexpr v = f<Type>(t);
^
note: the value of parameter "t" cannot be used as a constant
英特尔的编译器是正确的,因为“t”通常是未知的,不能用作常量。但是,仅使用在编译时是已知的“t”类型(定义模板参数包“TypeList”)。
为什么在 gcc 中允许但在 icc 中不允许?哪个编译器是正确的?
【问题讨论】:
-
clang和msvc也拒绝此代码。
标签: c++ gcc compiler-errors metaprogramming icc