Distinguishing between const and non-const variable in a template?

renoX renosky at free.fr
Thu Feb 22 22:51:49 PST 2007


Tyler Knott a écrit :
> renoX wrote:
>> mario pernici a écrit :
>>>
>>> The else clause static if(is(typeof(s))) is to make
>>> sure that s exists.
>>
>> Mmm; how could s doesn't exist?
>> D is supposed to be a statically typed language..
>>
>> renoX
> 
> D is statically typed, but that has nothing to do with why the second 
> test is needed.  Here's a quote from the language spec on the 
> typeof(Expression) construct 
> (http://www.digitalmars.com/d/declaration.html):
> 
>  > Expression is not evaluated, just the type of it is generated:
>  > void func()
>  > {   int i = 1;
>  >     typeof(++i) j;    // j is declared to be an int, i is not 
> incremented
>  >     printf("%d\n", i);    // prints 1
>  > }
> 
> And then if you look at the documentation for IsExpression, you'll see 
> that invalid types used in the context of an IsExpression won't error, 
> but instead cause the IsExpression to return 0 (false).  When you 
> combine these two properties, it is legal and valid for D code to take 
> the type of an undeclared variable (resulting in an invalid type) inside 
> an IsExpression; e.g.:
> 
> void main()
> {
>     int foo;
> 
>     static assert(is(typeof(foo)), "foo is a valid variable."); //Valid, 
> doesn't trip
>     static assert(is(typeof(undeclaredVariable)), "undeclaredVariable is 
> invalid."); //Valid, trips
>     typeof(foo) bar; //Valid, bar is an int
>     typeof(undeclaredVariable) bar; //"Error: undefined identifier 
> undeclaredVariable"
> }
> 
> This is why two tests are required for Mario Pernici's const dectector.  
> The first test determines if you can take the address of the variable, 
> which fails for both const and invalid variables.  Then, it needs to 
> make sure the variable actually exists by taking its type (invalid 
> variables will fail here, but everything else will pass).

Very clear explanation, thanks!
renoX


More information about the Digitalmars-d-learn mailing list