Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* C++ namespace using directives
@ 2002-04-16 14:41 Jim Blandy
  2002-04-16 19:39 ` Gabriel Dos Reis
  2002-04-22 14:52 ` Don Howard
  0 siblings, 2 replies; 5+ messages in thread
From: Jim Blandy @ 2002-04-16 14:41 UTC (permalink / raw)
  To: gdb


Could a C++ person check my understanding of `using namespace'
directives?

I'm reading Stroustrup, and the more I read about `using namespace',
the weirder it gets.  Check this out:

    namespace A
    {
      int x;
      int y;
      int z;
    };

    void f ()
    {
      int *x;

      {
        int *y;
        using namespace A;

        *x;  /* `x' refers to local x, not A::x */
        *y;  /* `y` refers to local y, not A::y */
        z;  /* `z' refers to A::z */ 
      }
    }

This program is type-correct, so you can see exactly which definitions
those identifiers refer to.  I ran it through the newest GCC, and it
didn't complain about ambiguities.  Stroustrup C.10.1 agrees.

Weird, huh?  Although the `using namespace' directive does make A's
variables visible, A's bindings are still *shadowed* by local
variables in blocks that *enclose* the one containing the `using
namespace' directive.

So, here's the way I'd describe the effect of a `using namespace'
directive:

To look up some identifier X in a scope that has a `using namespace N'
directive, search for both X and N::X.  If you find more than one
match, report an ambiguity.  (But see below for a subtlety in the
definition of an "ambiguity".)

Now, suppose you've got nested compound statements.  In the absence of
namespaces, you start at the innermost enclosing block, and work your
way out looking for a binding.  In the presence of `using namespace'
directives, you accumulate extra prefixes to search under as you go
out.

So in this case:

    namespace A
    {
      int x;
      int *y;
    };

    void
    f ()
    {
      using namespace A;

      {
        int *x;

        *x;  /* `x' refers to local x */
        *y;  /* `y' refers to A::y */
      }
    }

Since B has no binding for x, the reference in `*x' refers to the
local x, without ambiguity, even though A is `used' in an enclosing
scope.

Regarding what constitutes an "ambiguity": if the same declaration
makes it into a scope under two different names, that's not considered
an ambiguity.  So the compiler accepts the following without
complaint.

    namespace A
    {
      int x;
    };
    namespace B
    {
      using A::x;
    };

    void
    f ()
    {
      using namespace A;
      using namespace B;

      x;
    }

However, if we give namespace B its own `int x' definition, the
compiler does complain.

Is this all correct?


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2002-04-29 21:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-16 14:41 C++ namespace using directives Jim Blandy
2002-04-16 19:39 ` Gabriel Dos Reis
2002-04-22 14:52 ` Don Howard
2002-04-29 13:28   ` Jim Blandy
2002-04-29 14:30     ` Don Howard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox