こんにちは、gcc 4.7を使用してnoexcept移動コンストラクタでFooクラスを作成し、3番目のアイテムを追加するときにサイズを再割り当てする必要があるようにベクトル確保サイズを2に設定しました。これは、移動コンストラクタの代わりにコピーコンストラクタを呼び出すようです。私はここに何かを逃していますかベクトル再配置では、移動コンストラクタの代わりにコピーが使用されます
#include <vector>
#include <iostream>
class Foo
{
public:
Foo(int x) : data_(x)
{
std::cout << " constructing " << std::endl;
}
~Foo()
{
std::cout << " destructing " << std::endl;
}
Foo& operator=(const Foo&) = default;
Foo& operator=(Foo&&) = default;
Foo(Foo&& other) noexcept : data_(std::move(other.data_))
{
std::cout << " Move constructing " << std::endl;
}
Foo(const Foo& other) noexcept : data_(other.data_)
{
std::cout << " Copy constructing " << std::endl;
}
private:
int data_;
};
int main (int argc, char *argv[])
{
std::vector<Foo> v;
v.reserve(2);
v.emplace_back(1);
std::cout << "Added 1" << std::endl;
v.emplace_back(2);
std::cout << "Added 2" << std::endl;
v.emplace_back(3);
std::cout << "Added 3" << std::endl;
std::cout << "v size: " << v.size() << std::endl;
}
出力:
constructing
Added 1
constructing
Added 2
constructing
Copy constructing
Copy constructing
destructing
destructing
Added 3
v size: 3
destructing
destructing
destructing
私のclangビルドはコピーctorを一度起動しません。よりスマートなgccを手に入れる? – WhozCraig
GCC 4.8.1で期待通りに動作します(つまり、 'vector'は移動コンストラクタを呼び出します)。 –
[gcc 4.8.1](http://ideone.com/SXoMw2)とうまく動作します。 4.7 – Angew