5

这是基于此处提出的原始问题。

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

Lippman 在 p.303 的 c++ 入门书提到:

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

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

还:

例如,如果我们将 Account::period 传递给接受 const int& 的函数,则必须定义 period。

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

  • 理由是什么?
  • 标准是否明确指定了这些场景,或者这些场景是从更通用的引用中推导出来的?
4

2 回答 2

7

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

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

于 2013-01-27T14:00:06.310 回答
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);
  }
}
于 2013-01-27T13:54:44.917 回答