关于静态数据成员的类内初始化的困惑

时间:2013-01-27 12:36:01

标签: c++

我正在阅读lippman的c ++入门,其中p。他们给出了这个:

class Account {
private:
  static constexpr int period = 30;
  double daily_tbl[period];
}
  

如果成员仅在编译器可以替换成员值的上下文中使用,则不需要单独定义初始化的const或constexpr静态。但是,如果我们在无法替换值的上下文中使用该成员,则必须有该成员的定义。

此外:

  

例如,如果我们将Account :: period传递给一个带有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&的函数。我也没有为period变量添加任何定义。但我仍然没有错,因为他们说我应该得到。为什么不呢?

1 个答案:

答案 0 :(得分:6)

违反此规则不需要诊断。所以行为实际上是未定义的。

我认为不需要诊断的原因是因为诊断将由链接器给出。当编译器优化访问时(因为在这种情况下可能发生),链接器不再能够注意到任何错误。仍然注意到这个错误需要链接器中的整个程序分析,以便它可以访问原始的未优化的源代码表示。这会增加编译时间并需要高级链接器和编译器。