最近、Visual Studio 2010 Professional RCをインストールして、VC++2010に実装されているいくつかのC++0x機能を試してテストしました。
のを問題なくインスタンス化しましたstd::vector
。std::unique_ptr
ただし、一時をに渡してデータを設定しようとするとpush_back
、コンパイラはのコピーコンストラクタunique_ptr
がプライベートであると文句を言います。左辺値を動かして挿入してみましたが、問題なく動作します。
#include <utility>
#include <vector>
int main()
{
typedef std::unique_ptr<int> int_ptr;
int_ptr pi(new int(1));
std::vector<int_ptr> vec;
vec.push_back(std::move(pi)); // OK
vec.push_back(int_ptr(new int(2))); // compiler error
}
結局のところ、問題は、次のコードで示されているように、右辺値を処理するときにVC++が過負荷を解決する方法でもありませunique_ptr
ん。vector::push_back
struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}
private:
MoveOnly(const MoveOnly & other);
};
void acceptRValue(MoveOnly && mo) {}
int main()
{
acceptRValue(MoveOnly()); // Compiler error
}
コンパイラは、コピーコンストラクタにアクセスできないと文句を言います。公開すると、プログラムがコンパイルされます(コピーコンストラクターが定義されていなくても)。
右辺値参照について何か誤解しましたか、それともこの機能のVC ++ 2010実装の(おそらく既知の)バグですか?