Ops. I meant I'd like to return a container of non-copyable but movable objects, as shown in the example.
WBR,
Adam Romanek
Dnia 13 sie 2013 o godz. 16:09 Adam Romanek
Hi,
I'd like to return a container of non-movables from a function in C++03 with no success.
here is a sample code that does not compile for me:
#include
#include class non_copyable { BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable)
public: non_copyable(){} non_copyable(BOOST_RV_REF(non_copyable)) {} non_copyable& operator=(BOOST_RV_REF(non_copyable)) { return *this; } };
typedef boost::container::vector
nc_vector; nc_vector create() { return nc_vector(); }
int main () { nc_vector v(create()); return 0; }
The compiler says:
(...) /home/A.Romanek/tmp/boost/boost_1_54_0/boost/preprocessor/iteration/detail/local.hpp:37:1: error: passing ‘const non_copyable’ as ‘this’ argument of ‘non_copyable::operator boost::rv
&()’ discards qualifiers [-fpermissive] (...) See below for a full compiler output.
I use Boost v1.54 and gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3.
Is it a bug?
Here is the full compiler output:
In file included from /home/A.Romanek/tmp/boost/boost_1_54_0/boost/container/allocator_traits.hpp:388:0, from /home/A.Romanek/tmp/boost/boost_1_54_0/boost/container/detail/utilities.hpp:28, from /home/A.Romanek/tmp/boost/boost_1_54_0/boost/container/vector.hpp:37, from main.cpp:1: /home/A.Romanek/tmp/boost/boost_1_54_0/boost/preprocessor/iteration/detail/local.hpp: In static member function ‘static void boost::container::allocator_traits<Alloc>::priv_construct_dispatch2(boost::false_type, Alloc&, T*, const P0&) [with T = non_copyable, P0 = non_copyable, Alloc = std::allocator
, boost::false_type = boost::integral_constant ]’: /home/A.Romanek/tmp/boost/boost_1_54_0/boost/preprocessor/iteration/detail/local.hpp:37:1: instantiated from ‘static void boost::container::allocator_traits<Alloc>::priv_construct(boost::true_type, Alloc&, T*, const P0&) [with T = non_copyable, P0 = non_copyable, Alloc = std::allocator , boost::true_type = boost::integral_constant ]’ /home/A.Romanek/tmp/boost/boost_1_54_0/boost/preprocessor/iteration/detail/local.hpp:37:1: instantiated from ‘static void boost::container::allocator_traits<Alloc>::construct(Alloc&, T*, const P0&) [with T = non_copyable, P0 = non_copyable, Alloc = std::allocator ]’ /home/A.Romanek/tmp/boost/boost_1_54_0/boost/container/detail/utilities.hpp:555:10: instantiated from ‘typename boost::container::container_detail::disable_if_memcpy_copy_constructible::type boost::container::uninitialized_copy_alloc_n(A&, I, typename std::iterator_traits<_II>::difference_type, F) [with A = std::allocator , I = non_copyable*, F = non_copyable*, typename boost::container::container_detail::disable_if_memcpy_copy_constructible::type = non_copyable*, typename std::iterator_traits<_II>::difference_type = int]’ /home/A.Romanek/tmp/boost/boost_1_54_0/boost/container/vector.hpp:734:7: instantiated from ‘boost::container::vector ::vector(const boost::container::vector &) [with T = non_copyable, Allocator = std::allocator , boost::container::vector = boost::container::vector ]’ main.cpp:16:20: instantiated from here /home/A.Romanek/tmp/boost/boost_1_54_0/boost/preprocessor/iteration/detail/local.hpp:37:1: error: passing ‘const non_copyable’ as ‘this’ argument of ‘non_copyable::operator boost::rv &()’ discards qualifiers [-fpermissive] WBR, Adam Romanek