に、私はクラスFoo
を持っていると仮定する:の割り当ては、*これはコンストラクタ
class Foo {
public:
Foo(std::string s) noexcept : bar(std::move(s)) {}
// version 1
Foo(int x) noexcept
{
// do something...
std::string s = // ...to get a string from `x`
*this = Foo(std::move(s));
}
// version 2
Foo(int x) noexcept
: Foo([x] {
// do something...
std::string s = // ...to get a string from `x`
return Foo(std::move(s));
}())
{}
private:
std::string bar;
};
バージョン1は、クリーンなコードを持っていますが、2つの欠点があります:1)メンバーのデフォルトの初期化は高価である場合、またはconstが存在する場合メンバーは、このバージョンは動作しません。 2)はコンストラクタ内で*this
に割り当てられていますか?コンストラクタが返される前に、オブジェクトが「不完全な」状態になっている可能性があるため、この質問があります。
あなたはC++ 11を持っていますので、委任コンストラクタを使用してみませんか? 'Foo(int x):Foo(std :: to_string(x)){}' – kfsone
@kfsoneバージョン2のアイデアはそれだけです。この場合、文字列を直接返すことができましたが、実際のコードでは委譲されたコンストラクタに複数の引数が渡されるため、代わりに移動コンストラクタに委譲する必要があります。 –