GotW #88: A Candidate For the "Most Impotant const"

Herb Sutter氏のブログにて、Guru of the Weekの新作が公開されています


ネタ元 cppll:13250 - GotW #88: A Candidate For the "Most Important const"


GotW #88: A Candidate For the "Most Important const"

Guru of the Week



以下、簡単な和訳
(間違ってたら誰か指摘してください。。。)




GotW #88: "最も重要なconst"の候補


JG Questions

Q1 : このC++コードは正しいでしょうか?

// Example 1

string f() { return "abc"; }

void g() {
  const string& s = f();
  cout << s << endl; // この一時オブジェクトはまだ使える?
}

A1 : はい。正しいです

これはC++の機能です...このコードは有効であり、正確に動作します。

通常、一時オブジェクトの寿命はそれが現れる式の終わりまで続きます。
しかし、C++はスタック上で一時オブジェクトをconst参照に結びつけることで
参照そのものの有効期間を延ばし、さもなければ一般的な未解決参照エラーであることを
避けることを故意に示します。



Q2 : constを外した場合はどうだろう...Example 2は正しいC++コードでしょうか?

// Example 2

string f() { return "abc"; }

void g() {
  string& s = f(); // まだ正しい?
  cout << s << endl;
}

A2 : いいえ。このコードは正しくありません

constは重要です。
最初の行はエラーになります。
f()は一時オブジェクト(すなわち右辺値)を返しますが、非constの参照に束縛することができるのは左辺値だけだからです。




Guru Questions

Q3 : 参照がスコープから抜けるとき、どのデストラクタが呼ばれるでしょうか?

A3 : 一時オブジェクトのために呼ばれるのと同じデストラクタが呼ばれます。

当然の結果:Derived一時オブジェクトをconst Base&に持つことができます。
そしてそれは仮想ディスパッチなしのデストラクタが呼び出されます。

これは素晴らしいです。
以下のコードを考えてください。

// Example 3

Derived factory(); // Derivedオブジェクトの生成

void g() {
  const Base& b = factory(); // ここでDerived::Derivedが呼び出される
  // ... use b ...
} // ここで直接Derived::~Derivedが呼び出される -- Base::~Base + 仮想ディスパッチではない