Distinguishing between const and non-const variable in a template?
Tyler Knott
tywebmail at mailcity.com
Thu Feb 22 16:45:26 PST 2007
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).
More information about the Digitalmars-d-learn
mailing list