繁体   English   中英

C++ 模板:值应该是编译时常量,但编译器说不是

[英]C++ Templates: value should be compile-time constant but compiler says it's not

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。 这些 const 变量只依赖于编译时常量,所以它们也应该是编译时常量,对吧? 如果是这样,为什么编译器会抱怨 sqrt<> 的参数不是编译时常量?

注意: sqrt<> 在其他地方有效。

const只是意味着程序不可修改,并不意味着编译时以任何方式。 constexpr是一个不同的关键字,当应用于变量时,它意味着编译时常量。

事实证明,问题不在于编译器的无能; 我在表达式的一部分中溢出,标准明确包括有符号溢出作为表达式不恒定的条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM