1

の有効活用に関する記事を読んでいましたauto_ptr。そこでは、次のコードが正しいコードとして提案されました。

// Example 10(c): Correct (finally!)
//
auto_ptr<String> f()
{
  auto_ptr<String> result = new String;
  *result = "some value";
  cout << "some output";
  return result;  // rely on transfer of ownership;
                  // this can't throw
}

しかし、私が知る限り、の代入演算子は、偶発的な誤用を避けるために、別のものを-としてauto_ptrのみ受け入れます。それで、次の行は記事のタイプミスですか、それとも実際に機能すると思われますか?auto_ptrrhs

auto_ptr<String> result = new String;
4

1 に答える 1

5

その行は確かに間違っていますが、あなたが考える理由ではありません。代入演算子は呼び出さず、代わりにコンストラクターを呼び出します。最初にオブジェクトを宣言するとき=、オブジェクトを作成してから代入演算子を呼び出すことはありません。むしろ、コンストラクターを呼び出し、それを引数として渡します。したがって、この観点からは、代入演算子ではなくコンストラクターを使用しているため、「正しい」です。

または、少なくとも可能であればそうなるでしょう。std::auto_ptrのコンストラクターがポインターを受け取ることに気付くでしょう。ただし、マークが付いexplicitているため、上記の「ショートカット」は使用できません。コンストラクターを(括弧付きで)明示的に呼び出す必要があり、=そのためのショートカットとして使用することはできません。これが間違っている理由です。代わりに、彼らが言った場合auto_ptr<String> result(new String);、すべてがうまくいくでしょう。また、コンストラクターがマークされていない場合はexplicit、すべて問題ありません。しかし、それは正しくありません。

于 2012-11-28T06:09:56.607 に答える