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