次のコード( http://liveworkspace.org/code/5oact )が与えられます:
class Foo
{
public:
Foo()
{
log(__PRETTY_FUNCTION__);
}
Foo(const Foo& other)
{
log(__PRETTY_FUNCTION__);
}
Foo& operator=(const Foo& other)
{
log(__PRETTY_FUNCTION__);
return *this;
}
Foo(Foo&& other) noexcept
{
log(__PRETTY_FUNCTION__);
}
Foo& operator=(Foo&& other) noexcept
{
log(__PRETTY_FUNCTION__);
return *this;
}
~Foo(){}
};
このようなクラスの使用:
std::vector<Foo> tt;
tt.emplace_back();
tt.emplace_back();
tt.emplace_back();
tt.emplace_back();
次の出力が得られます。
Foo::Foo()
Foo::Foo()
Foo::Foo(const Foo&)
Foo::Foo()
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo()
カスタムデストラクタを削除すると、次の出力が得られます。
Foo::Foo()
Foo::Foo()
Foo::Foo(Foo&&)
Foo::Foo()
Foo::Foo(Foo&&)
Foo::Foo(Foo&&)
Foo::Foo()
デストラクタを宣言するときに、コンパイラが移動ではなくコピーコンストラクタを使用するのはなぜですか?移動操作はスローできないことを理解しています(noexcept
コードからを削除すると、コンパイラはそれをまったく使用しません)が、デストラクタはそれと何の関係がありますか?