On Mon, 26 Jul 2010 17:42:53 -0400, Tomek Sowiński <j...@ask.me> wrote:

W dniu 26.07.2010 22:56, Nick Sabalausky pisze:
"Steven Schveighoffer"<schvei...@yahoo.com>  wrote in message
Your simple example doesn't make any sense.  Why wouldn't you just make
foo public? If it's publicly accessible through an alias, it's publicly
accessible.  I don't buy the "too hard to understand" argument.  Just
don't document the "private" members :)

IMO, protection attributes applied to an alias make no sense whatsoever.
I don't think the above code should compile, except dmd accepts lots of
noop attributes...


I disagree. I think it's perfectly rational. Perhaps a better example than
the above:

private void foo_implA() {...}
private void foo_implB() {...}
private void bar_implA() {...}

static if( isDerpDerpDerp )
{
     public alias foo_implA foo;
     public alias bar_implA bar;
}
else
{
     public alias foo_implB foo;

     // If isDerpDerpDerp isn't true, then 'bar' is logically equivilent
     // to the faster foo_implB, so just use that:
     public alias foo_implB bar;
}

I see no reason to disallow something like that.

But do you see the problem? The *alias* is public, but the *function* is private. To me it looks like, "here's a public name for my private function" I don't think it makes the function public, just the name, which doesn't make any sense. IMO, all three impl should be public if you want them to be callable.



Yes, or a real-life example (sorry for quoting myself, but seems Steven's joke overshadowed it :) ):

struct PermutationMatrixExpr(Permutation permut) {
     static if (permut == Permutation.RowWise) {
         alias byPermutationDim byRows;
         alias byPermutationOrthoDim byColumns;
     } else {
         alias byPermutationDim byColumns;
         alias byPermutationOrthoDim byRows;
     }

private:

// Definitions for byPermutationDim & byPermutationOrthoDim

}

Again, I don't see the problem in making byColumns and byRows public. If that's not an option, you can always wrap, and rely on inlining (well, hopefully when inlining is good enough). I just don't see this as being something that's of enough use to justify a compiler change.


Let me draw a parallel example:

int x;
const alias x y;  // I want y to be a const view of x

Does this make any sense?


Just because one particular attribute doesn't make sence doesn't mean they
all don't make sence.

But a public alias to a private function to me is worthless. The function must be kept private, because that was the intention of the author.

Can anyone give a good counter-example when a public alias of a non-public symbol is evil?

How about this one:

class A
{
   private int foo() {};
   public alias foo bar;
}

class B
{
   public int bar() {};
}

A a = new B;
a.bar(); // What should this call?

-Steve

Reply via email to