这是基于提出的原始问题 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
必须定义?
知道会很有帮助,
答案 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);
}
}