2

FooRAII に従うクラス、たとえば を実装しようとしていますが、クラスのオブジェクトは値によってクライアントに返されます。

class SomeClass {
public:
  class Foo {
    public:
      ~Foo() { /* follow raii */ }
    private:
      friend class SomeClass;
      Foo() { /* follow raii */ }
  };

  Foo getFoo() { return Foo(); }
};

私の当面の質問はFoo、呼び出し時にタイプのオブジェクトが1つだけ構築されることを確認する方法はありますSomeClass::getFoo()か? ほとんどのコンパイラは、1 つのオブジェクトのみを構築する必要があることを認識していると思いますが、ほとんどの場合、これは保証されていません。私が取ることができるより良いアプローチはありますか?

boost::shared_ptr<Foo>共有ポインターを構築するときに、を返してオブジェクトを割り当てようとしましたがFoo、これはうまく機能します。ただし、ヒープ割り当てが必要であり、インターフェイスがクリーンでなくなるため、理想的ではないようです。

ありがとう!

明確化

Visual Studio 2005 コンパイラなので、R-val 参照と C++11 関連の機能は利用できないと思います。

4

2 に答える 2

2

あなたは最善のアプローチを取りました。コピー (または実際には C++11 では移動) は、ほぼ確実にコンパイラによって省略されます。実際、呼び出しコード内の戻り値から何らかのオブジェクトへのコピーでさえ、おそらく省略されるでしょう。したがって、これは単一のコンストラクターのみを呼び出します。

Foo foo = sc.getFoo();

これらのコピー (または移動) の両方を省略できるルールは次のとおりです。

参照 (12.2) にバインドされていない一時クラス オブジェクトが同じ cv 非修飾型のクラス オブジェクトにコピー/移動される場合、一時オブジェクトをターゲットに直接構築することにより、コピー/移動操作を省略できます。省略されたコピー/移動の

于 2013-04-03T22:35:06.080 に答える