インターネットでどこを読んでも、自分のクラスをうまく機能させたい場合std::vector
(つまり、自分のクラスのムーブ セマンティクスが によって使用された場合std::vector
) は、ムーブ コンストラクターを 'noexcept' (またはnoexcept(true)
) として宣言する必要があることを強くお勧めします。
実験としてstd::vector
マークしたのに、なぜそれを使用したのですか?noexcept(false)
#include <iostream>
#include <vector>
using std::cout;
struct T
{
T() { cout <<"T()\n"; }
T(const T&) { cout <<"T(const T&)\n"; }
T& operator= (const T&)
{ cout <<"T& operator= (const T&)\n"; return *this; }
~T() { cout << "~T()\n"; }
T& operator=(T&&) noexcept(false)
{ cout <<"T& operator=(T&&)\n"; return *this; }
T(T&&) noexcept(false)
{ cout << "T(T&&)\n"; }
};
int main()
{
std::vector<T> t_vec;
t_vec.push_back(T());
}
出力:
T()
T(T&&)
~T()
~T()
なんで ?私は何を間違えましたか?
CXX_FLAGS を次のように設定して gcc 4.8.2 でコンパイル:
--std=c++11 -O0 -fno-elide-constructors