Шаблоны С++: значение должно быть константой времени компиляции, но компилятор говорит, что это не так

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 и ldc как const. Эти константные переменные зависят только от констант времени компиляции, поэтому они должны быть также константами времени компиляции, верно? Если да, то почему компилятор жалуется на то, что параметр sqrt‹> не является константой времени компиляции?

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


person he77789    schedule 08.04.2020    source источник
comment
Опубликуйте минимально воспроизводимый пример.   -  person BessieTheCookie    schedule 08.04.2020
comment
Переменные не определены как константы времени компиляции. Вам нужно использовать constexpr вместо const. Кроме того, запись const long long int в качестве параметра шаблона смехотворно излишня. Напишите либо long long, либо std::int64_t (или напишите в другом месте using std::int64_t и сократите его до int64_t).   -  person ALX23z    schedule 08.04.2020
comment
const просто означает, что программа не может его модифицировать, и никоим образом не подразумевает время компиляции. constexpr — это другое ключевое слово, которое при применении к переменной подразумевает константу времени компиляции.   -  person Zuodian Hu    schedule 08.04.2020
comment
@ZuodianHu вместо этого опубликуйте это как ответ   -  person he77789    schedule 08.04.2020


Ответы (2)


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

person Zuodian Hu    schedule 08.04.2020

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

person he77789    schedule 08.04.2020