"private:" remains in effect after end of containing attribute{}

Bill Baxter dnewsgroup at billbaxter.com
Fri Apr 6 12:48:25 PDT 2007


Daniel Keep wrote:
> 
> I believe this is because it *should* say: "affects all declarations
> until the end of the scope", and "final { ... }" doesn't introduce a scope.

These non-scope curly braces have always made me uneasy.  Makes it 
difficult for my C++-adjusted eyes to tell at a glance what's still 
active and what's not.  I guess C++ has the "namespace {}" non-scope 
block, but that's only used at the top level scope so use cases can't 
get too complicated.

As for an alternative, I guess you could play around with alternate 
block delimiters for non-scope blocks

static if (is(foo==bar)) <<
     writefln("hello world")
 >>

static if (is(foo==bar)) :{
     writefln("hello world")
}:

static if (is(foo==bar)) |{
     writefln("hello world")
}|

static if (is(foo==bar)) ::
     writefln("hello world")
::

I kind of like ':{ }:'  The colons are like a dotted line, a 1-D sieve 
if you will, indicating that things can 'pass through' this block.  Also 
meshes well with the non-scoping tags like "private:"

You could phase it in with three-step plan:
1) add :{ }: (or whatever) as an alternate syntax which can be used for 
"non-scope block" in the current non-scope contexts (static if, version, 
public etc)

2) deprecate/warn about uses of plain {} with non-scope blocks.

3) make plain {} with non-scope blocks an error.

4) Finally, reintroduce the ability to use {} with things like static 
if, but this time have them really create a scope (where a scope makes 
sense). This way we can ultimately get back to the shiny happy rule of 
'{ }' always makes a scope whenever it can.

On the other hand, no one else seems to be bothered by this but me.   I 
thought I'd get this off my chest anyway.  :-)

--bb



More information about the Digitalmars-d mailing list