1

OK、次の一連のイベントがあります。

  1. r値オブジェクトを構築します
  2. そのr値オブジェクトへのイテレータをパラメータとして関数に渡します
  3. 関数はこの反復子で動作します
  4. 関数はこの反復子を値で返します
  5. イテレータを逆参照します

r値オブジェクトのクリーンアップの原因がわかりません。その行の終了ですか?

OK、具体的には、この質問に対するより良い答えを見つけようとしています: string Multiplication in C++そして、私はコードを持っています:

const auto bar = 13U;
const char multiplicand[] = "0, ";
const auto length = strlen(multiplicand);
const string foo(&*generate_n(string(bar * length, '\0').begin(), bar * length, [&]() {
    static auto i = 0U;
    return multiplicand[i++ % length];
}) - bar * length);

stringそのため、内部で構築された がいつgenerate_n破棄されるべきかを知りたいです。ちなみに、これは gcc 5.1 で問題なく動作するようです: http://ideone.com/Y8rDs5しかし、未定義の動作が発生する可能性があります。これは、コードが Visual Studio 2015 でセグメンテーション違反を起こすという事実によって暗示されています。

4

1 に答える 1

1

などの一時的なものは、完全なstring(bar * length, '\0')式の最後で破棄されます。完全な式は の初期化子です。したがって、一時文字列は ctor が戻る前に破棄されません。const string foofoo

于 2016-02-24T11:01:01.363 に答える