#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>());
}
Если компиляции с г ++ 4.8.5, 5.2.0, 5.3.0 и -DDDDEQUE
я получаю сообщение об ошибке многословного заканчивающегосяC++ станд :: 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...
компилирует КИ , С VC2015, VC2012 обе версии скомпилируют ОК. deque
(но не vector
) нужен конструктор копирования для gcc?
Несвязанный, вам не хватает значения 'return' в вашем операторе присваивания. И fwiw, вы можете добавить clang 3.8 в список toolchains, который скомпилируется даже при определении 'DDDEQUE'. – WhozCraig
Это больше похоже на вопрос о gcc. Поэтому, возможно, 'gcc' должен быть тегом. Btw, любая разница, если вы используете 'vd.emplace (vd.end(), 1, std :: move (std :: deque ())); вместо этого? – Walter