c++类可以在头文件中包含内联初始化的静态const std::数组吗?
Can a C++ class contain a static const std::array initialized inline in a header file?
这是我得到的:
struct Foo
{
static std::array<double, 4> acgt_default_background_frequencies() { return {0.281774, 0.222020, 0.228876, 0.267330}; }
};
但是我更喜欢不使用函数,而是有一个变量,像这样:
struct Foo
{
static constexpr std::array<double, 4> acgt_default_background_frequencies = {0.281774, 0.222020, 0.228876, 0.267330};
};
我想编译的,但是当我尝试使用Foo::acgt_default_background_frequencies
时,它会给链接器错误"对' Foo::acgt_default_background_frequencies'的未定义引用"。
我想做的是可能的吗?我认为,如果我将值内联为const,而不是将其隐藏在.cpp文件中,那么对于我的头的读者来说,这是更清晰的,并且具有常数而不是函数也似乎更清晰。警员允许这样的事情发生不是很重要吗?如果不可能,为什么不呢?
在第二个示例中,您拥有的是具有初始化式的static
数据成员的声明,但是您没有在任何地方提供定义。如果对该成员使用odr-use,则需要定义。
要提供定义,请将以下内容添加到.cpp文件
constexpr std::array<double, 4> Foo::acgt_default_background_frequencies;
问题中的声明在c++ 14中有效,但注意在c++ 11中你需要额外的一组花括号,例如
struct Foo
{
static constexpr std::array<double, AlphabetSize> acgt_default_background_frequencies = {{0.281774, 0.222020, 0.228876, 0.267330}};
};
N3337 §9.4.2/3/3 [class.static.data]
…文字类型的
static
数据成员可以用constexpr
说明符在类定义中声明;如果是,它的声明应该指定一个大括号或等号初始化器,其中每个初始化器子句是一个赋值表达式是一个常量表达式. ...如果成员在程序中被odr使用(3.2),则该成员仍应在命名空间作用域中定义,并且命名空间作用域定义不应包含初始化式。
相关文章:
- 初始化类中的静态 const 数组 - C++
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 匿名命名空间中的const与静态const
- 内联初始化的静态 const 类成员的初始化顺序保证
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 我可以在类头文件中定义一个类的const静态实例吗
- 如何在 C++ 中的类之外使用 const 静态成员变量
- 当尝试使用它来初始化数组时,未识别C const静态成员
- const静态方法修改值
- 错误:ISO C++禁止在类内初始化非 const 静态成员
- 如何保证模板化结构中 const 静态成员的初始化顺序
- 为什么在 cpp 文件中定义了非 int const 静态
- 如何保证 const 静态成员初始化顺序
- c++如何在派生类中实现const静态成员
- 未在类中使用const静态变量优化出来
- 定义需要在运行时设置的const静态
- c++ const静态成员数组初始化
- 是否在类外部重新声明const静态变量
- 应该在c++头文件中初始化const静态变量吗