【问题标题】:C++: "(static const double variable) cannot appear in constant-expression"C ++:“(静态常量双变量)不能出现在常量表达式中”
【发布时间】:2018-01-19 16:08:59
【问题描述】:

classA 我有:

static const double alias_var = classB::const_var;

然后在classB:

static const double const_var = 1000.;

但是编译器一直告诉我:

'classB::const_var' 不能出现在常量表达式中。

为什么不呢?有趣的是,如果我将 classB::const_vardouble 更改为 int,错误就会消失。

我内联了这些变量以进行优化。我希望使用浮点数不会妨碍优化。

我在 Ubuntu 64 位环境中使用 GCC 5.4.0。我确定我使用 Qt4 与它无关。

编辑:我最好的解决方法是在classB

static const int const_var_int = 1000;
static const double const var = const_var_int;

然后在classA(其他任何地方)将const_var_int 分配给我的浮点数。它摆脱了错误。我不知道这是否违背了目的或还有什么其他后果。

【问题讨论】:

标签: c++ compiler-errors static-variables inlining


【解决方案1】:

简答:使用constexpr 而不是const

长答案:旧 C++03 中有一些特殊规定,允许在常量表达式中使用作为静态整数常量的类成员。此规定不适用于非积分(双打)。

在 C++11 中,constexpr 消除了这个限制。

【讨论】:

  • 看起来我对这些较新的 C++ 有一些了解。我什至不确定我使用的是哪一个,并且我收到“警告:标识符 'constexpr' 是 C++11 [-Wc++0x-compat] 中的关键字”
  • @Opux 我真诚地认为在 2018 年使用 C++2003 是罪恶的。你今天想开 2003 年的丰田吗?
  • 我确信我的 2007 Civic 将在 3.5 年后继续保持强劲势头。这种升级需要大范围的改变,而这些决定不取决于我。我可以向我的老板提这件事,但与此同时,我该怎么办?我已根据解决方法的最佳想法编辑了答案
  • @Opux 如果是这种情况,请不要使用 double 作为 constexpr
  • @Opux 因为这是 GCC 的非标准扩展,所以无论如何都允许这样做(因为标准不允许类内初始化 const 双精度)。看起来 gcc 5.4 确实使用类内设置值而不是读取变量,所以你的优化应该在那里。当心 - 在更高版本的 GCC 中这是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多