Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.std.c++ > #767

Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly?

Message-ID <31d52d8d-796a-4b61-8e56-6da52f2136be@googlegroups.com> (permalink)
Newsgroups comp.std.c++
From Johannes Gerd Becker <johannes.gerd.becker@googlemail.com>
Subject Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly?
Organization unknown
References <820594f6-b670-4dba-8254-26d352489616@googlegroups.com> <5e134e90-067e-4d71-bf40-c4396bfc52f4@googlegroups.com>
Date 2015-08-01 21:09 -0600

Show all headers | View raw


Of course, defining a helper function outside the class is a workaround (as
is first defining a base class, as described in my original post).

The point I would like to make, however, is another one.

There are workarounds, yet they get the more tedious the more often the
problem arises, namely in templated code. (To begin with: templates live
mostly in headers, so the helper functions must live in headers as well,
and break encapsulation, pollute my namespace or are simply inconvenient as
they have to be templates themselves).

It seems consensus (more or less) now that non-member functions defined in
the same namespace as a class are part of the interface of that class,
BECAUSE they will usually be found by ADL.

Now the rule that, within a member function of some class, say B, member
functions of B take absolute precendence when a name is looked up, has the
unwanted effect that some part of the interface of another, completely
unrelated class A, namely the nonmember functions that belong to the
interface of A, may become unusable from within B.

Why can I write

using namespace std;
auto i = begin (vec);

everywhere in my code, yet not within a class that has a member function
named begin ()?

I tempted to think this should be considered a design mistake.

One could think of several approaches to solve that problem:

1.) Introduce a clause like

using explicit this;

which would locally force explicitly using this-> when you want to access a
member. Then I would write

using namespace std;
using explicit this;
auto i = begin (vec); // ADL
auto j = this->begin (); // member

2.) Introduce a special qualifier (like, e.g., .::) to indicate that the
following name does *not* refer to a member function. Then I could write

using namespace std;
auto i = .::begin (vec); // ADL
auto j = begin (); // member


--
[ comp.std.c++ is moderated.  To submit articles, try posting with your ]
[ newsreader.  If that fails, use mailto:std-cpp-submit@vandevoorde.com ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]

Back to comp.std.c++ | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Shouldn't there be a way to exclude member functions out of name  lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-07-27 11:22 -0600
  Shouldn't there be a way to exclude member functions out of name   lookup explicitly? Anton Bikineev <ant.bikineev@googlemail.com> - 2015-07-30 11:54 -0600
    Re: Shouldn't there be a way to exclude member functions out of name    lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-01 21:09 -0600
      Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Jakob Bohm <jb-usenet@wisemo.com> - 2015-08-12 13:00 -0600
        Re: Shouldn't there be a way to exclude member functions out of name  lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-16 17:29 -0600
          Re: Shouldn't there be a way to exclude member functions out of name lookup explicitly? Jakob Bohm <jb-usenet@wisemo.com> - 2015-08-18 22:35 -0600
  Re: Shouldn't there be a way to exclude member functions out of name  lookup explicitly? Richard Smith <richard@ex-parrot.com> - 2015-08-20 01:10 -0600
    Re: Shouldn't there be a way to exclude member functions out of name   lookup explicitly? Johannes Gerd Becker <johannes.gerd.becker@googlemail.com> - 2015-08-21 19:14 -0600

csiph-web