C++ 中的静态常量双重初始化
static const double initialization in C++
我有一些使用 "newer" 编译器构建的遗留代码,运行 出现一些对我来说没有意义的静态常量双重初始化错误。这是我拥有的:
//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
我已经揭穿了这不是静态初始化顺序的失败,因为我相信内部数据类型有一个明确定义的初始化顺序——尤其是当它们存在于同一个 class 中时。作为测试,我已经尝试 static_cast< double >
表达式,但这会产生另一个错误,指出在 const 表达式中只允许整数类型转换。
static
不是 constexpr
的数据成员如果是整数或枚举类型,则只能在 class 定义中的声明中直接初始化。所有其他数据类型必须在源文件中单独定义,并且只能在该定义处初始化。因此,将您的 class 定义更改为:
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++,则可以选择将 in-class 声明更改为 constexpr
:
class myclass
{
private:
static constexpr double foo = 3.1415;
static constexpr double bar = 12345.0 * foo;
};
这样一来,它们就不需要在源文件中定义,除非您将它们用作对象而不是值(例如,如果您获取它们的地址)。但是,GCC 4.3.3 不支持 C++11 的那部分。
我有一些使用 "newer" 编译器构建的遗留代码,运行 出现一些对我来说没有意义的静态常量双重初始化错误。这是我拥有的:
//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
我已经揭穿了这不是静态初始化顺序的失败,因为我相信内部数据类型有一个明确定义的初始化顺序——尤其是当它们存在于同一个 class 中时。作为测试,我已经尝试 static_cast< double >
表达式,但这会产生另一个错误,指出在 const 表达式中只允许整数类型转换。
static
不是 constexpr
的数据成员如果是整数或枚举类型,则只能在 class 定义中的声明中直接初始化。所有其他数据类型必须在源文件中单独定义,并且只能在该定义处初始化。因此,将您的 class 定义更改为:
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++,则可以选择将 in-class 声明更改为 constexpr
:
class myclass
{
private:
static constexpr double foo = 3.1415;
static constexpr double bar = 12345.0 * foo;
};
这样一来,它们就不需要在源文件中定义,除非您将它们用作对象而不是值(例如,如果您获取它们的地址)。但是,GCC 4.3.3 不支持 C++11 的那部分。