------- Comment #1 from redi at gcc dot gnu dot org  2010-08-23 13:17 -------
The summary seems backwards: the conversion shouldn't generate operator==,
instead using operator== should trigger the conversion, but fails to when the
conversion operator is a template.

Strangely, adding a non-template conversion operator causes template argument
deduction to succeed, even though the non-template operator isn't used
e.g.

#include <iostream>
struct null {
    null() {}
    template<class T>
    operator T*() const {
        return 0;
    }

    template<class C, class T>
    operator T C::*() const {
        return 0;
    }
private:
    operator double*() const;  // ???
    null(const null&);
    null& operator=(const null&);
    void operator&() const;
};

static struct null null;

int main() {
    int* ptr = null;
    std::cout << (ptr == null) << ", " << (ptr != null);
    return 0;
}


-- 

redi at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
  GCC build triplet|(many, read below)          |
   GCC host triplet|(many, read below)          |
 GCC target triplet|(many, read below)          |
           Keywords|                            |rejects-valid
   Last reconfirmed|0000-00-00 00:00:00         |2010-08-23 13:17:12
               date|                            |
            Summary|[g++ >= 4.5 ] Implicit      |[4.5/4.6 Regression]
                   |conversion to pointer does  |Implicit conversion to
                   |no longer automatically     |pointer does no longer
                   |generate operator== and     |automatically generate
                   |operator!=.                 |operator== and operator!=.


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45383

Reply via email to