Boost logo

Boost Users :

Subject: [Boost-users] [container / move] return a container of non-movables from a function in C++03
From: Adam Romanek (romanek.adam_at_[hidden])
Date: 2013-08-13 10:09:42


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 <boost/container/vector.hpp>
#include <boost/move/utility.hpp>

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<non_copyable> 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<non_copyable>&()’ 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<non_copyable>, boost::false_type =
boost::integral_constant<bool, false>]’:
/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<non_copyable>, boost::true_type =
boost::integral_constant<bool, true>]’
/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<non_copyable>]’
/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<I,
F, F>::type boost::container::uninitialized_copy_alloc_n(A&, I, typename
std::iterator_traits<_II>::difference_type, F) [with A =
std::allocator<non_copyable>, I = non_copyable*, F = non_copyable*,
typename
boost::container::container_detail::disable_if_memcpy_copy_constructible<I,
F, F>::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<T,
Allocator>::vector(const boost::container::vector<T, Allocator>&) [with
T = non_copyable, Allocator = std::allocator<non_copyable>,
boost::container::vector<T, Allocator> =
boost::container::vector<non_copyable>]’
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<non_copyable>&()’ discards qualifiers
[-fpermissive]

WBR,
Adam Romanek


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net