Remove algo code duplication

Jonathan Wakely jwakely.gcc@gmail.com
Wed May 2 19:51:00 GMT 2012


On 2 May 2012 20:34, François Dumont wrote:
>> Ah, yes, to remove the code, the new solution has to work in C++98, which
>> prevents the simpler solution of having a non-template functor __less that
>> perfectly forwards anything it is given to operator<.
>
> non-template, really ?

I assume Mark means something like:

struct less {
  template<typename T, typename U>
    bool operator()(T&& t, U&& u)
    { return std::forward<T>(t) < std::forward<U>(u); }
};

i.e. a class (not a class template) with a member function template.

>> 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. In fact I also expect the
> compiler to optimize away all the functor simple plumbery, if there is a way
> to make this assumption safer do not hesitate to tell me. I wonder if not
> qualifying the parenthesis operators as const might be a reason for the
> compiler to not inline it. If it is so important I will try to detect if the
> invoked operator is const qualified to make the parenthesis operator const
> also.

That's unlikely to change anything, the compiler can tell if the
functor is stateless and not modified by the function call operator.

> Maybe I should add a noexcept qualification ?

Does the standard forbid operator< from throwing?  I don't see such a
restriction.



More information about the Libstdc++ mailing list