#include <memory>
#include <vector>
//-----------------------------------------------------------------------------
class one
{
public:
one(){}
one(one&& other) : x(std::move(other.x)) {}
one& operator=(one&& other){ x = std::move(other.x); return *this; }
void swap(one& other){ x.swap(other.x); } // REMOVED THE CONST HERE <---
void swap(one&& other){ x.swap(std::move(other.x)); }
private:
one(const one&);
one& operator=(const one&);
std::unique_ptr<int> x;
};
//-----------------------------------------------------------------------------
void swap(one& left, one& right)
{
left.swap(right);
}
//-----------------------------------------------------------------------------
void swap(one&& left, one& right)
{
right.swap(std::move(left));
}
//-----------------------------------------------------------------------------
void swap(one& left, one&& right)
{
left.swap(std::move(right));
}
//-----------------------------------------------------------------------------
class two
{
public:
two(){}
two(two&&){}
two& operator=(two&&){ return *this; }
operator one(){return one();}
private:
two(const two&);
two& operator=(const two&);
};
//-----------------------------------------------------------------------------
int main()
{
std::vector<two> twos(10);
std::vector<one> ones(std::make_move_iterator(twos.begin()), std::make_move_iterator(twos.end()));
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHZlY3Rvcj4KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3Mgb25lCnsKcHVibGljOgogICAgb25lKCl7fQoJb25lKG9uZSYmIG90aGVyKSA6IHgoc3RkOjptb3ZlKG90aGVyLngpKSB7fQoJb25lJiBvcGVyYXRvcj0ob25lJiYgb3RoZXIpeyB4ID0gc3RkOjptb3ZlKG90aGVyLngpOyByZXR1cm4gKnRoaXM7IH0KCgl2b2lkIHN3YXAob25lJiBvdGhlcil7IHguc3dhcChvdGhlci54KTsgfSAvLyBSRU1PVkVEIFRIRSBDT05TVCBIRVJFIDwtLS0KCXZvaWQgc3dhcChvbmUmJiBvdGhlcil7IHguc3dhcChzdGQ6Om1vdmUob3RoZXIueCkpOyB9Cgpwcml2YXRlOgoJb25lKGNvbnN0IG9uZSYpOwoJb25lJiBvcGVyYXRvcj0oY29uc3Qgb25lJik7CgoJc3RkOjp1bmlxdWVfcHRyPGludD4geDsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBzd2FwKG9uZSYgbGVmdCwgb25lJiByaWdodCkKewoJbGVmdC5zd2FwKHJpZ2h0KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIHN3YXAob25lJiYgbGVmdCwgb25lJiByaWdodCkKewoJcmlnaHQuc3dhcChzdGQ6Om1vdmUobGVmdCkpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgc3dhcChvbmUmIGxlZnQsIG9uZSYmIHJpZ2h0KQp7CglsZWZ0LnN3YXAoc3RkOjptb3ZlKHJpZ2h0KSk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgdHdvCnsKcHVibGljOgoJdHdvKCl7fQoJdHdvKHR3byYmKXt9Cgl0d28mIG9wZXJhdG9yPSh0d28mJil7IHJldHVybiAqdGhpczsgfQoKCW9wZXJhdG9yIG9uZSgpe3JldHVybiBvbmUoKTt9Cgpwcml2YXRlOgoJdHdvKGNvbnN0IHR3byYpOwoJdHdvJiBvcGVyYXRvcj0oY29uc3QgdHdvJik7Cn07CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBtYWluKCkKewoJc3RkOjp2ZWN0b3I8dHdvPiB0d29zKDEwKTsKCXN0ZDo6dmVjdG9yPG9uZT4gb25lcyhzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih0d29zLmJlZ2luKCkpLCBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih0d29zLmVuZCgpKSk7Cn0=
prog.cpp: In member function 'void one::swap(one&&)':
prog.cpp:13:51: error: no matching function for call to 'std::unique_ptr<int>::swap(std::remove_reference<std::unique_ptr<int>&>::type)'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unique_ptr.h:200:7: note: candidate is: void std::unique_ptr<_Tp, _Tp_Deleter>::swap(std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/memory:65:0,
from prog.cpp:1:
prog.cpp: In function 'void std::_Construct(_T1*, _T2&&) [with _T1 = two, _T2 = const two&]':
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_uninitialized.h:248:3: instantiated from 'static void std::__uninitialized_fill_n<<anonymous> >::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = two*, _Size = unsigned int, _Tp = two, bool <anonymous> = false]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_uninitialized.h:284:7: instantiated from 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = two*, _Size = unsigned int, _Tp = two]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_uninitialized.h:379:7: instantiated from 'void std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&, std::allocator<_Tp2>&) [with _ForwardIterator = two*, _Size = unsigned int, _Tp = two, _Tp2 = two]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:1039:2: instantiated from 'void std::vector<_Tp, _Alloc>::_M_fill_initialize(std::vector::size_type, const value_type&) [with _Tp = two, _Alloc = std::allocator<two>, std::vector::size_type = unsigned int, value_type = two]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:230:9: instantiated from 'std::vector<_Tp, _Alloc>::vector(std::vector::size_type, const value_type&, const allocator_type&) [with _Tp = two, _Alloc = std::allocator<two>, std::vector::size_type = unsigned int, value_type = two, allocator_type = std::allocator<two>]'
prog.cpp:58:26: instantiated from here
prog.cpp:51:2: error: 'two::two(const two&)' is private
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_construct.h:80:7: error: within this context