Confused by <bits/predefined_ops.h>
Jonathan Wakely
jwakely@redhat.com
Thu Jan 19 08:39:00 GMT 2017
On 19/01/17 08:32 +0000, Jonathan Wakely wrote:
>On 18/01/17 22:17 +0100, François Dumont wrote:
>>Hi
>>
>>Names of functions and struct in this file are surely not what I am
>>most proud of in libstdc++. I even think that I confess it when I
>>proposed the patch :-)
>>
>>As those elements are purely internal and we rarely need to be touch
>>I don't consider it as a big issue but if you want to rename
>>everything don't hesitate.
>>
>>Note that I also have this patch pending:
>>
>>https://gcc.gnu.org/ml/libstdc++/2015-10/msg00071.html
>>
>>But I can surely rework it on top of your changes unless you just
>>want me to forget it.
>
>It looks good, let's return to it in stage 1 for gcc 8.
>
>Any thoughts on the questions repeated below?
>
>As for PR78346, I can fix it by making the relevant function object
>types take their constructor arguments by reference, so that the
>reference we store in _M_ref is bound to some iterator in the caller's
>scope, not the constructor argument that goes out of scope immediately
>(see patch below). But why do those objects store a reference anyway?
>Why don't they just store the iterator passed to the constructor and
>dereference it as needed? Is this to avoid dereferencing multiple
>times? Because that might be slow?
This is the alternative I prefer, storing the iterator and
dereferencing as needed:
@@ -207,17 +207,17 @@ namespace __ops
template<typename _Iterator1>
struct _Iter_equals_iter
{
- typename std::iterator_traits<_Iterator1>::reference _M_ref;
+ _Iterator1 _M_it1;
explicit
_Iter_equals_iter(_Iterator1 __it1)
- : _M_ref(*__it1)
+ : _M_it1(__it1)
{ }
template<typename _Iterator2>
bool
operator()(_Iterator2 __it2)
- { return *__it2 == _M_ref; }
+ { return *__it2 == *_M_it1; }
};
template<typename _Iterator>
@@ -273,16 +273,16 @@ namespace __ops
struct _Iter_comp_to_iter
{
_Compare _M_comp;
- typename std::iterator_traits<_Iterator1>::reference _M_ref;
+ _Iterator1 _M_it1;
_Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
- : _M_comp(_GLIBCXX_MOVE(__comp)), _M_ref(*__it1)
+ : _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1)
{ }
template<typename _Iterator2>
bool
operator()(_Iterator2 __it2)
- { return bool(_M_comp(*__it2, _M_ref)); }
+ { return bool(_M_comp(*__it2, *_M_it1)); }
};
template<typename _Compare, typename _Iterator>
More information about the Libstdc++
mailing list