Следующий код компилируется на 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
Компилятор Intel прав в том, что 't' обычно неизвестно и не может использоваться в качестве константы. Однако используется только тип «t», который известен во время компиляции (для определения пакета параметров шаблона «TypeList»).
Почему это разрешено в gcc, но не в icc? Какой компилятор правильный?
clang
иmsvc
также отклоняют этот код. - person Holt   schedule 31.01.2019