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

2024-07-01

这是基于最初提出的问题here https://stackoverflow.com/questions/14547370/confusion-about-in-class-initialization-of-static-data-members.

[Detailed]: Here is the relevant question as requested in comments

Lippman 的 c++ 入门书第 303 页提到:

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

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

Also:

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

那么为什么会通过Account::period到一个需要一个函数const int&,需要那个period必须定义?
了解这将非常有帮助,

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐