if(arr) now a warning

jkpl via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 10 03:09:17 PDT 2015


On Friday, 10 April 2015 at 09:35:44 UTC, John Colvin wrote:
> On Thursday, 9 April 2015 at 20:59:00 UTC, Steven Schveighoffer 
> wrote:
>> A confusing and dangerous "feature" of D was to treat the 
>> expression if(arr) as meaning if(arr.ptr).
>>
>> Anyone coming from any number of other languages may think 
>> that if(arr) means "if arr has any elements". Typically one 
>> cares what is inside an array, not where it lives.
>>
>> However, while checking to see if an array has elements is 
>> very similar to checking for a null pointer (obviously, a null 
>> pointer array should have no elements), it's not equivalent. 
>> Therefore, when attempting to fix this confusion, we had to 
>> disable the if(arr) check altogether. You must now specify 
>> what part of the array you care about, if(arr.ptr) or 
>> if(arr.length).
>>
>> As usual with changes of this nature, there are differing 
>> opinions, and differing styles. I personally never use null as 
>> a special value for an array, but others do. They use if(arr) 
>> to actually mean if(arr.ptr). For these cases, the update will 
>> cause some amount of busywork changing these checks.
>>
>> But when updating Phobos to comply with this change, we found 
>> several actual incorrect usages. So I think the change is 
>> worth it, and not much busywork. YMMV.
>>
>> What do you think?
>>
>> references:
>>
>> https://issues.dlang.org/show_bug.cgi?id=4733
>> https://github.com/D-Programming-Language/dmd/pull/2885
>> https://github.com/D-Programming-Language/tools/pull/166
>>
>> -Steve
>
> As others have mentioned, why not make if(arr) be equivalent to 
> if(arr.length)? It seems that's what everyone actually wants 
> when they type it.

This is not a good idea.

People who writed `if(arr)` were misunderstanding the thing. In 
every other parts of the language `if(x)` only works for pointers 
and types implicitely convertibles to bool (and other expressions 
returning such things...).

They were wrong and their error must not be accepted. An array is 
more or less like a struct and (POD) structs are never null (i 
exclude the structs with an alias this from the statement).

Then, imagine that the syntactic shortcut is accepted, this would 
lead to the following confusion:
---
char[] * arr;
if(arr)
---
Here the test is really about the array being null or not.

It's like in the topic from yesterday:

---
void a(uint p, string a = null){}
---

Totally wrong, the guy should write:

---
void a(uint p, string a = ""){}
---

because if you pass a struct as param, the param is never null !

I'm against the shortcut...it doesn't help to understand how it 
works. It's a useless and confusing shortcut. Warning about the 
amibuous usage was the right
to do.


More information about the Digitalmars-d mailing list