繁体   English   中英

C ++中的静态const双重初始化

[英]static const double initialization in C++

我有一些用“较新”的编译器构建的旧代码,并且遇到了一些对我来说没有意义的静态const双重初始化错误。 这是我所拥有的:

//header.h

class myclass
{
   private:
      static const double foo = 3.1415;
      static const double bar = 12345.0 * foo;
};

使用gcc版本4.3.3编译此代码时-我看到以下错误:

 foo cannot appear in a constant-expression

我已经认为这不是静态初始化顺序的失败,因为我相信固有数据类型具有明确定义的初始化顺序-尤其是当它们位于同一类中时。 作为测试,我已经尝试过static_cast< double >表达式,但这会产生另一个错误,指出const表达式中仅允许使用整型强制类型转换。

constexpr static数据成员如果是整数或枚举类型,则只能在类定义中的声明处直接初始化。 必须在源文件中给所有其他数据类型一个单独的定义,并且只能在该定义上进行初始化。 因此,将您的类定义更改为:

class myclass
{
   private:
      static const double foo;
      static const double bar;
};

并将这些定义完全引入一个.cpp文件中:

const double myclass::foo = 3.1415;
const double myclass::bar = 12345.0 * foo;

如果您可以使用足够现代的C ++,则可以选择将类内声明更改为constexpr

class myclass
{
   private:
      static constexpr double foo = 3.1415;
      static constexpr double bar = 12345.0 * foo;
};

这样,除非您将它们用作对象而不是值(例如,使用地址),否则它们将不需要在源文件中进行定义。 但是,GCC 4.3.3不支持C ++ 11的该部分。

暂无
暂无

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

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