constexpr различия между G CC и clang - PullRequest
6 голосов
/ 05 мая 2020

Следующие компилируются в G CC 9, но не в clang 10, и мне интересно, какой из двух компиляторов соответствует стандарту:

template<typename T>
struct A {
  static const T s;
  static const T v;
};

template<typename T>
constexpr const T A<T>::s = T(1);

template<typename T>
constexpr const T A<T>::v = A<T>::s;

int main(int, char**) {
  constexpr auto a = A<double>::v;
  return 0;
}

Предполагается, что это минимальный пример более серьезная проблема, поэтому поля s и v явно объявлены как const, но определены как constexpr, это сделано намеренно.

Является ли G CC правильным для компиляции этого кода или Правильно ли clang отклонять его?

1 Ответ

1 голос
/ 05 мая 2020

Компиляторы должны обрабатывать static const переменные целочисленного и перечисляемого типов как constexpr, только если они инициализируются константным выражением. Это позволило использовать их в качестве длин массивов до того, как constexpr было добавлено в язык.

...