#include <iostream>
using namespace std;
class Friendly {
  int i;
public:
  Friendly(int theInt) { i = theInt; }
  friend void f(const Friendly&); // Needs global def.
  void g() { f(*this); }
};
void h() {
  f(Friendly(1));  // Uses ADL
}
void f(const Friendly& fo) {
  cout << fo.i << endl;
}
int main() {
  h(); // Prints 1
  Friendly(2).g();
}

this is code from thinking in c++ 2nd ed. Here bruce says that f()
(globally defined and friend of class Friendly) is looked through ADL
when used in h() (look at the commented line above).

But in the c++ standard (2nd ed.-2003), section 11.4, the 5th paragraph
says:
        A function can be defined in a friend declaration of a class if
        and only if the class is a non-local class, the function name is
        unqualified, and the function has namespace scope. [Example:
        class M {
                friend void f() { } // definition of global f, a friend
                of M,
                // not the definition of a member function
        };
        —end example] Such a function is implicitly inline. A friend
        function defined in a class is in the (lexical) scope of the
        class in which it is defined. A friend function defined outside
        the class is not (3.4.1).
///////////////////////////////////////////////////////////////////////
The point is that Bruce Eckel said if f(Friendly(1)) was replaced by
f(1) (which makes sense as Friendly can be converted from int) then the
compiler should issue an error because there's no hint for the ADL
lookup where to look. The g++ compiles the code without complaining, and
as i noticed from the standard that should be the right behavior since
f() has now global scope which will make it a candidate for the call and
subsequently force conversion of 1 to Friendly(1).

I would appreciate your comments on that.
-- 
                                                          John V. Shahid



_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to