对静态数据成员的类内初始化感到困惑
Confusion about in-class initialization of static data members
我正在阅读 lippman 的 c++ 入门书,在第 303 页上,他们给出了这个:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
}
如果成员仅在编译器可以替换成员值的上下文中使用,则不需要单独定义初始化的 const 或 constexpr 静态。但是,如果我们在无法替换值的上下文中使用成员,则必须为该成员定义。
也:
例如,如果我们将 Account::p eriod 传递给一个接受 const int&的函数,则必须定义 period。
所以我尝试添加这样的函数:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
void foo(const int &i) { ; }
void bar() { foo(period); } //no error?
};
在那里,我添加了一个函数,该函数采用 const int&。我也没有为周期变量添加任何定义。但我仍然没有错误,正如他们说的那样,我应该得到。为什么不呢?
违反此规则不需要诊断。因此,行为实际上是未定义的。
我认为不需要诊断的原因是因为诊断将由链接器给出。当编译器优化访问时(在这种情况下可能发生),链接器不会再注意到任何错误。仍然注意到此错误将需要在链接器中进行整个程序分析,以便它能够访问原始的未优化源代码表示形式。这会增加编译时间,并且需要高级链接器和编译器。
相关文章:
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- "local scope"中的 C++ 初始化静态变量
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- 如何从静态类函数初始化静态类对象
- C++:用IIFE线程初始化静态局部变量安全吗
- 如何在 c++ 中初始化静态类对象?
- 使用 lambda 初始化静态数组
- 使用 lambda 函数初始化静态数据成员
- 如何从 std::integer_sequence 初始化静态数组?
- 在构造函数中初始化静态函数指针
- C - 初始化静态成员的方法
- 大括号使用枚举类初始化静态常量unordered_map
- C++ main 函数中初始化静态变量
- 在定义(.cpp文件)中初始化静态浮点 constexpr 成员是可能的
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 如何在运行时使用静态成员函数初始化静态成员变量
- 与其他静态const成员初始化静态常量成员