std::vector::push_back
コピー不可能(プライベートコピーコンストラクタ)で移動可能なオブジェクトにしようとすると、g++ (GCC) 4.7.2
でコンパイルエラーが発生しますが、MSVC-2012
ではコンパイルエラーが発生します。私の例は、SOや他の多くの例と同じように見えます。エラーメッセージは、構造体が「直接構築可能」ではないという問題のように見えます。なぜこれが何を意味するのかわからないので、なぜオブジェクトをプッシュバックする必要があるのかが不明です。std :: vector :: push_backコピー不可能なオブジェクトでコンパイルエラーが発生する
#include <vector>
#include <memory>
struct MyStruct
{
MyStruct(std::unique_ptr<int> p);
MyStruct(MyStruct&& other);
MyStruct& operator=(MyStruct&& other);
std::unique_ptr<int> mP;
private:
// Non-copyable
MyStruct(const MyStruct&);
MyStruct& operator=(const MyStruct& other);
};
int main()
{
MyStruct s(std::unique_ptr<int>(new int(5)));
std::vector<MyStruct> v;
auto other = std::move(s); // Test it is moveable
v.push_back(std::move(other)); // Fails to compile
return 0;
}
エラーに様々な答えから
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/type_traits: In instantiation of ‘struct std::__is_direct_constructible_impl<MyStruct, const MyStruct&>’:
... snip ...
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/stl_vector.h:900:9: required from ‘void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = MyStruct; _Alloc = std::allocator<MyStruct>; std::vector<_Tp, _Alloc>::value_type = MyStruct]’
main.cpp:27:33: required from here
main.cpp:16:5: error: ‘MyStruct::MyStruct(const MyStruct&)’ is private
簡単な回避策与える:
boost::noncopyable
(またはプライベートctorのと別のクラス)をハック
- 使用
MyStruct(const MyStruct&) = delete;
代わりprivate ctor
のを
そのコードは実際には奇妙なSFINAE問題のような完璧なコンパイルが必要です。あなたは '.emplace_back(std :: move(other))'を試すことができますか? – Xeo
'emplace_back'と同じエラーです(私はすでにそれを試していましたが、いくつかの要点と一緒に) – Zero
' std :: unique_ptr'だけを実行するとどうなりますか? – Xeo