This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

iter_swap on move_iterator


Hi

While working on removal of code duplications in algos implementation I challenge them with move_iterator. I started with stable_sort and it doesn't compile. I summarize the problem to the fact that iter_swap can't be used on move_iterator. As, in C++11, iter_swap simply forward to swap(*__a, *__b) it is normal that it can't accept rvalue but shouldn't iter_swap be adapted to accept move_iterator ?

I also find the compilation error message surprising. I have added a call to iter_swap in 24_iterators/move_iterator/greedy_ops.cc and the error message is:

In file included from /home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/char_traits.h:41:0,

from /home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/ios:41,

from /home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/ostream:40,

from /home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/iterator:64,

from /home/fdt/dev/gcc/libstdc++-v3/testsuite/24_iterators/move_iterator/greedy_ops.cc:20:

/home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h: In instantiation of 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = std::move_iterator<greedy_ops::X*>; _ForwardIterator2 = std::move_iterator<greedy_ops::X*>]':
/home/fdt/dev/gcc/libstdc++-v3/testsuite/24_iterators/move_iterator/greedy_ops.cc:39:24: required from here
/home/fdt/dev/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:148:7: error: no matching function for call to 'swap(std::move_iterator<greedy_ops::X*>::value_type, std::move_iterator<greedy_ops::X*>::value_type)'
swap(*__a, *__b);
^


Why is the comipiler talking about a call to swap on move_iterator<greedy_ops::X*>::value_type. It should be on the return type of move_iterator operator* which is move_iterator<>::reference, no ?

François


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]