5

これは、ここで尋ねられた元の質問に基づいています。

[詳細]:コメントで要求された関連する質問は次のとおりです

p.303のLippmanのc++入門書は、次のように述べています。

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

メンバーが、コンパイラーがメンバーの値を置き換えることができるコンテキストでのみ使用される場合、初期化されたconstまたはconstexprstaticを個別に定義する必要はありません。ただし、値を代入できないコンテキストでメンバーを使用する場合は、そのメンバーの定義が必要です。

また:

たとえば、Account ::periodをconstint&を取る関数に渡す場合は、periodを定義する必要があります。

では、なぜ、定義する必要Account::periodのある、を受け取る関数に渡すのでしょうか。 知っておくと非常に役立ちます、 const int&period

  • 理論的根拠は何ですか?
  • 標準はこれらのシナリオを明示的に指定していますか、それともこれらはより一般的な見積もりから推測されていますか?
4

2 に答える 2

7

メンバーがアドレスを取得したことがない場合(または、同等に、参照がバインドされている場合)、コンパイラはその値を使用できます。この値はすべてのTUで同じであるため、右辺値が必要ないため、問題はありません。アドレス。または、アドレスを確認できないため、各TUまたは必要なものにコピーを作成できます。

ただし、アドレスを取得しようとすると、コンパイラには、すべてのTUでアドレスが同じであることを確認する義務があります。C ++の本当に恐ろしいTUシステムのため、これは1つだけの明示的な定義が必要であることを意味します。

于 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 に答える