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