Remove algo code duplication

Marc Glisse marc.glisse@inria.fr
Wed May 2 20:10:00 GMT 2012


[Jonathan already answered most of it]

On Wed, 2 May 2012, François Dumont wrote:

>>> 2. Compatible with existing code, code submitted by Christopher last time 
>>> will still compile. To do so I used std::iterator_traits<>::reference type 
>>> so that if the iterator is not const then the operator do not have to take 
>>> const reference or to be const qualified neither. For the same reason I 
>>> have also avoided some const qualifiers on the introduced functors.
>> 
>> It probably doesn't matter, but the difference with the current code can be 
>> seen. With -fno-elide-constructors you perform copies, operator< is always 
>> given an lvalue, etc.
> You mean functor copies, right ? I expect the compiler to optimize them away 
> even if there are options to forbid him to do so.

I mean value copies, performed by the functor.

#include <iostream>
struct A {
   A(){std::cout << "A()\n";}
   A(A const&){std::cout << "A(A const&)\n";}
   A(A &&){std::cout << "A(A &&)\n";}
};
bool operator<(A,A){return true;}
struct less {
   bool operator()(A a,A b)const{return a<b;}
};
struct Iter {
   A operator*()const{return A();}
};

int main(){
   Iter x;
   std::cout << "hello\n";
   *x < *x; // all copies elided
   std::cout << "pause\n";
   less()(*x,*x); // 2 copies can't be elided
   std::cout << "bye\n";
}

hello
A()
A()
pause
A()
A()
A(A const&)
A(A const&)
bye


I am not saying it is necessarily a bad thing, just that the difference is 
noticable. Note that the functor less posted by Jonathan would keep 2 move 
constructors instead of the 2 copy constructors.

(note: I am not sure that's what I had in mind when I wrote that email, I 
can't remember exactly)

-- 
Marc Glisse



More information about the Libstdc++ mailing list