(非完全)constexpr模板参数的要求

时间:2016-04-05 16:58:39

标签: c++ templates language-lawyer constexpr

GCC(5.3.0)和Clang(3.8.0)都同意这是有效的代码:

constexpr std::integral_constant<size_t, 0> n{};
std::get<n>(std::make_tuple(123));

然而,他们不同意这一点:

std::integral_constant<size_t, 0> n;
std::get<n>(std::make_tuple(123));

Clang没问题,但是GCC报告“'n'的值在常量表达式中不可用”/“'n'未被声明为'constexpr'”。

谁的行为符合标准?

1 个答案:

答案 0 :(得分:1)

Clang是对的,虽然它最终取决于你的库实现。该标准本身不允许在常量表达式中为非constexprconst)对象调用expr函数;只使用该对象的成员才会出问题(参见[expr.const]/(2.7.3))。由于转换运算符肯定只返回0,因此它可能是一个GCC错误(在考虑错误消息时也有提示)。