#include <deque>
#include <vector>
struct A
{
A(int* const p) : m_P(p) {}
A(A&& rhs) : m_P(rhs.m_P) { rhs.m_P = nullptr; }
A& operator=(A&& rhs) { delete m_P; m_P = rhs.m_P; rhs.m_P = nullptr; }
~A() { delete m_P; }
A(A const& rhs) = delete;
A& operator=(A const& rhs) = delete;
int* m_P;
};
int main()
{
#ifdef DDDEQUE
std::vector<std::pair<int, std::deque<A> > > vd;
vd.emplace(vd.end(), 1, std::deque<A>());
#endif // #ifdef DDDEQUE
std::vector<std::pair<int, std::vector<A> > > vv;
vv.emplace(vv.end(), 1, std::vector<A>());
}
如果使用g ++ 4.8.5,5.2.0,5.3.0和-DDDDEQUE
編譯我得到C++的std :: deque的拷貝構造函數問題
.../bits/stl_construct.h:75:7: error: use of deleted function ‘A::A(const A&)’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
^
gcc.cpp:11:5: note: declared here
A(A const& rhs) = delete;
結束了詳細的錯誤信息,而不-D...
編譯OK 。 用VC2015,VC2012兩個版本編譯OK。 deque
(但不是vector
)是否需要gcc的拷貝構造函數?
無關,您在移動賦值運算符中缺少一個「返回」值。而fwiw,即使定義了「DDDEQUE」,也可以將clang 3.8添加到編譯的工具鏈列表中。 – WhozCraig
這似乎更多關於gcc的問題。所以也許'gcc'應該是一個標籤。順便說一句,任何區別,如果你使用'vd.emplace(vd.end(),1,std :: move(std :: deque ()));'而不是? – Walter