OpenGL テクスチャからいくつかの機能をカプセル化するクラスを作成しました。私の要件は非常に単純なので、テクスチャ データとタイプを制御できること以上のことは必要ありません。私のクラスは次のとおりです(簡略化):
class Texture
{
std::vector<unsigned char> _data;
[...]
public:
Texture(std::vector<unsigned char> data, vec2 size, GLint internal_format, GLenum format, GLenum type);
Texture(const Texture& other)
{
//copies the data and creates a new buffer with OpenGL
}
Texture(Texture&& other) noexcept
{
//moves the data, copies the buffer id and set the old buffer id to 0
}
}
現在、std::vector を使用していくつかのテクスチャを管理する別のクラスがあり、メモリ管理のほとんどを自動化するために、これらのテクスチャをヒープに割り当てる必要がないことに気付きましたstd::vector<Texture>
。問題は、ベクターに新しいテクスチャを追加すると、移動ではなくコピーが作成されることです。コピー コンストラクター/代入演算子を削除すると、std::vector が移動します。しかし、状況によってはコピーする必要があります。保持するテクスチャの数がわかっているので、ベクターを予約することもできます。これらの両方の解決策の問題は、他にどのようなケースがあるのか わからないことと、移動セマンティクスが正しく機能することを期待していることです。
この問題に関する他の回答を読みましたが、使用noexcept
しても問題は解決しません。前述のように、コピー コンストラクターを削除すると、移動コンストラクターが選択されます。を外してnoexcept
何かを投げても。これは正しいです?使用可能なコピー コンストラクターがない場合、コンパイラは安全でない移動コンストラクターを使用する必要がありますか? また、コンパイラが私が提供している安全な移動コンストラクタを選択しないのはなぜですか?
(私は GCC 4.7 を使用しています)
[編集]
例を作成しました: http://liveworkspace.org/code/4bzSMD $6 そして、デフォルトのデストラクタをそのままにしておくと移動コンストラクタが使用されることに気付きましたが、デストラクタを指定するとコピーされます。何故ですか?