9

私はリップマンのc ++入門書を読んでいます。303彼らはこれを与える:

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

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

また:

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

だから私はそのような機能を追加しようとしました:

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

  void foo(const int &i) { ; }
  void bar() { foo(period); } //no error?
};

そこで、const int& を取る関数を追加しました。また、期間変数の定義も追加しませんでした。しかし、それでもエラーは発生しません。なぜだめですか?

4

1 に答える 1

6

この規則に違反した場合、診断は必要ありません。したがって、動作は事実上未定義です。

これを診断する必要がない理由は、リンカーによって診断が行われるためだと思います。そして、コンパイラーがアクセスを最適化すると (おそらくこの場合に起こったように)、リンカはもはや何も問題に気付くことができなくなります。それでもこのエラーに気付くには、元の最適化されていないソース コード表現にアクセスできるように、リンカーでプログラム全体を分析する必要があります。これにより、コンパイル時間が長くなり、高度なリンカとコンパイラが必要になります。

于 2013-01-27T12:49:30.833 に答える