为什么将静态的类内初始化成员传递给采用const引用的函数需要成员有一个定义?

时间:2013-01-27 13:36:59

标签: c++ c++11 static

这是基于提出的原始问题 here

[详细]:以下是评论中要求的相关问题

Lippman关于p.303的c ++引言提到:

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

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

此外:

  

例如,如果我们将Account :: period传递给一个带有const int&的函数,那么必须定义period。

那么为什么将Account::period传递给需要const int&的函数,需要period必须定义?
知道会很有帮助,

  • 理由是什么?
  • 标准是否明确指定了这些方案,还是从更通用的引用推断出这些方案?

2 个答案:

答案 0 :(得分:6)

如果成员从未拥有它的地址(或者,等效地,绑定了它的引用),编译器可以简单地使用它的值,并且这个值在每个TU中都是相同的,所以没有问题,因为rvalues没有必须有地址。或者它可以在每个TU或其他任何想要的地方制作副本,因为你无法观察它的地址。

但是如果你试图获取地址,编译器有义务确保在所有TU中,地址是相同的。由于C ++真正可怕的TU系统,这意味着只需要一个明确的定义。

答案 1 :(得分:0)

我认为理由是:

const int* get_addr(const int& i) {
  return &i;
}

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

  const int* period_ptr() {
    return get_addr(period);
  }
}