1

この例を見てください:

class Foo {
private:
  const std::string m_str1;
  const std::string m_str2;

  std::string foo() {
    std::cout << ("'" + m_str2 + "'") << std::endl;
    return "whatever1";
  }

public:
  Foo() : m_str1(foo()), m_str2("whatever2") { }
};

int main() {
  Foo foo;
  return 0;
}

私のコンピューターでは、コンストラクターリストが実行される前にm_str2が実際に値が空の文字列に初期化されたことを示す''(2つの一重引用符が次々に)を出力します。

しかし、それは一般的に本当ですか?

4

2 に答える 2

7

クリスがコメントしたように、Foo意志の構築は、順番に

  • 初期化m_str1
  • 初期化m_str2
  • (空の)コンストラクター本体を実行します

の初期化中にm_str1m_str2がまだ初期化されていないことを確認しています。

m_str2あなたが言うように、空の文字列に値が初期化されていません

m_str2その時点でのアクセスは未定義の動作です。

于 2013-02-11T01:39:51.047 に答える
4

これは未定義の動作です。 が呼び出さm_str2れたときはまだ構築されていません。foo()それが機能しているように見えるという事実はおそらく偶然です。

于 2013-02-11T01:39:46.257 に答える