Thread overview
Get pointer or reference of an element in Array(struct)
Dec 09, 2017
anonymous
Dec 09, 2017
David Nadlinger
Dec 09, 2017
Azi Hassan
December 09, 2017
Is there a way to get the pointer or reference of an element in Array(T)?

https://run.dlang.io/gist/70fd499afe8438d4877f57aec90c3091?compiler=dmd

The assertion seems to fail below. Value copy is not is intended here.

module test;

void main()
{
    struct Data
    {
        int id;
    }

    import std.container.array;
    Array!Data gallery;

    Data d1;
    gallery.insertBack(d1);

    auto d2 = gallery[0];
    d2.id = 1;
    assert(d2.id == gallery[0].id, "neither ref nor pointer");
}

December 09, 2017
On Saturday, 9 December 2017 at 06:15:16 UTC, Arun Chandrasekaran wrote:
> Is there a way to get the pointer or reference of an element in Array(T)?
[...]
>     auto d2 = gallery[0];

auto d2 = &gallery[0];
December 09, 2017
On Saturday, 9 December 2017 at 06:38:46 UTC, anonymous wrote:
> On Saturday, 9 December 2017 at 06:15:16 UTC, Arun Chandrasekaran wrote:
>> Is there a way to get the pointer or reference of an element in Array(T)?
> [...]
>>     auto d2 = gallery[0];
>
> auto d2 = &gallery[0];

Thanks. Just curious why reference can't be obtained here. Saves nasty null checks in most places.
December 09, 2017
On Saturday, 9 December 2017 at 06:46:27 UTC, Arun Chandrasekaran wrote:
> Thanks. Just curious why reference can't be obtained here. Saves nasty null checks in most places.

D simply doesn't have a (C++-style) concept of references as part of the type. Arguments can be passed by reference - hence the `ref` keyword -, but "free" references don't exist in the language.

The ref in foreach loop variables can be conceptually thought of as a parameter to the loop body as well. (For opApply-based iteration, the loop body indeed gets turned into a function; for "plain" iteration the compiler AST internally has special ref variables, but they are not visible to the language.)

 -David
December 09, 2017
On Saturday, 9 December 2017 at 06:46:27 UTC, Arun Chandrasekaran wrote:
> On Saturday, 9 December 2017 at 06:38:46 UTC, anonymous wrote:
>> On Saturday, 9 December 2017 at 06:15:16 UTC, Arun Chandrasekaran wrote:
>>> Is there a way to get the pointer or reference of an element in Array(T)?
>> [...]
>>>     auto d2 = gallery[0];
>>
>> auto d2 = &gallery[0];
>
> Thanks. Just curious why reference can't be obtained here. Saves nasty null checks in most places.

In D, structs are passed by value unless otherwise specified. Using a class will yield the expected result.
December 11, 2017
On Saturday, 9 December 2017 at 19:26:26 UTC, David Nadlinger wrote:
> but "free" references don't exist in the language.

To the point! Thanks!