2016-04-05 3 views
1

И GCC (5.3.0) и Clang (3.8.0) согласен, что это правильный код:Требования (не-quite-) аргументы constexpr шаблона

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 нормально с ним, но сообщает НКУ «значение„N“не может использоваться в постоянном выражении»/«„п“не был объявлен„constexpr“».

Чье поведение соответствует стандарту?

ответ

1

Clang прав, хотя это в конечном счете зависит от реализации вашей библиотеки. Стандарт сам по себе не запрещает вызов функции constexpr для объекта без const (expr) в постоянных выражениях; проблемой будет использование только членов этого объекта (см. [expr.const]/(2.7.3)). Поскольку оператор преобразования, безусловно, просто возвращает 0, это, вероятно, ошибка GCC (также наводит на размышления при рассмотрении сообщения об ошибке).

Смежные вопросы