The following snippet looks legal to me, but it does not compile: #include <list>
struct aaa {}; struct bbb { aaa operator & ( void ) const { return aaa(); } }; bool operator< ( bbb lhs, bbb rhs ) { return ( false ); } int main ( void ) { std::list< bbb > a; } I run into the same problem with the containers std::vector, std::deque, and std::set. It appears that while calling the allocator functions construct() and destroy(), the library uses operator& to figure out an address and overloading that operator triggers a problem. I venture the conjecture that one could also conjure programs that will compile but exhibit strange behavior by using, e.g., bbb* operator& ( void ) const { return 0; } But I have not tested this. In any case, I don't recall a conceptual requirement from the standard saying that datatypes to be used in list<> have to have a sane operator&. Best Kai-Uwe Bux -- Summary: overloading the address operator confuses the standard containers Product: gcc Version: 4.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jkherciueh at gmx dot net GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41792