Dynamic array creation with default

Steven Schveighoffer schveiguy at yahoo.com
Wed Aug 24 04:17:08 PDT 2011


On Tue, 23 Aug 2011 10:45:33 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> On 8/23/11 6:15 AM, foobar wrote:
>> == Quote from bearophile (bearophileHUGS at lycos.com)'s article
>>> foobar:
>>>> you raise a valid concern but this looks too complicated.
>>>> I'd suggest to simplify into only two cases.
>>>>
>>>> // 1) T.INIT - as you suggested the dimension should be checked
>>>> auto foo = new int[][](10, 20); // correct
>>>> auto foo1 = new int[][](10); // compilation error
>>> Keep in mind that currently this is correct and it generates a 1D  
>>> dynamic array:
>>> auto v = new int[10];
>>
>> Isn't this an inconsistency in the language?
>>
>> // Generally speaking, allocates an instance of T on the heap
>> auto foo = new T;
>>
>> However, "int[10]" and "new int[10]" are different types.
>
> I hate that, too. Walter hates it, too, but we both reckon it's too late  
> now to change things. It makes it impossible to create an instance of  
> the type "int[10]" dynamically because of an gratuitous syntactic  
> special case. It comes from C++, where it was an unforced error.

It's actually possible, but ugly:

auto ptr = (new int[10][](1)).ptr;

One really interesting thing to note -- the compiler actually turns struct  
allocations into array-of-one allocations in the runtime.  So this is  
likely what the compiler would do if it supported direct heap allocation  
of fixed-sized arrays.

-Steve


More information about the Digitalmars-d mailing list