Шаблоны C ++: значение должно быть константой времени компиляции, но компилятор говорит, что это не так - PullRequest
0 голосов
/ 08 апреля 2020
template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz> class rtH{
  public: static const long long int sqlc=cx*cx+cy*cy+cz*cz;
static const long long int ldc=lx*cx+ly*cy+lz*cz;
};
template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz, const long long int r> class rt{
  public: static const long long int d=rtH<lx,ly,lz,cx,cy,cz>::ldc-sqrt<rtH<lx,ly,lz,cx,cy,cz>::ldc*rtH<lx,ly,lz,cx,cy,cz>::ldc-(rtH<lx,ly,lz,cx,cy,cz>::sqlc-r*r),20>::value
  ;
};
int main(){return rt<1,1,1,1,1,1,1>::d;}

Компилятор не жалуется на создание экземпляра rt, поэтому он знает, что lx, ly, lz, cx, cy, cz, r являются константами времени компиляции. В rtH я определил sqlc и ld c как постоянный. Эти константные переменные зависят только от констант времени компиляции, поэтому они также должны быть константами времени компиляции, верно? Если так, почему компилятор жалуется на то, что параметр для sqrt <> не является константой времени компиляции?

Примечание: sqrt <> работает в других местах.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

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

0 голосов
/ 08 апреля 2020

Оказывается, проблема не в невозможности компилятора; Я переполнял часть выражения, и стандарт явно включает в себя переполнение со знаком в качестве условия, чтобы выражение не было постоянным.

...