Const / ref проблема в D - PullRequest
       27

Const / ref проблема в D

7 голосов
/ 08 августа 2011

Я пытаюсь реализовать свой собственный диапазон в D, и у меня возникают проблемы с его .front() методом.

Edit:

Мне нужно, чтобы возвращаемое значение было на ref.

  • Если я сделаю это const, то возвращенный объект будет копией , что не то, что я хочу.

  • Если я не сделаю это const, тогда я вообще не смогу использовать .front на const копии моего диапазона.

Как мне это решить?

struct MyRange(T)
{
    T[] buf;

    @property ref T front() { return this.buf[0]; }  // No error, but not const
    @property ref T front() const { return this.buf[0]; }  // Errors
    @property T front() const { return this.buf[0]; }  // No error, but a copy

    // Can't have all three
}

Ответы [ 2 ]

7 голосов
/ 08 августа 2011

Попробуйте это:

struct MyRange(T)
{
    T[] buf;

    @property ref T front() { return this.buf[0]; }
    @property ref const(T) front() const { return this.buf[0]; }
}

Проблема в вашем примере заключается в том, что вы сделали front const, но не возвращаемое значение, и компилятор не позволит вам избежать изменяемой ссылки на такие данные const.

Теперь я хотел бы отметить, что в целом не следует ожидать, что диапазоны констант будут работать очень хорошо. По своей природе они должны быть изменяемыми, чтобы выполнять итерацию по ним (поскольку вы не можете вызвать popFront в диапазоне констант), поэтому вы не сможете сделать намного больше, чем просто с помощью front и * 1009. * с постоянным диапазоном. Ситуация не была бы такой плохой, если бы вы могли неявно преобразовать диапазон const в диапазон tail-const, но это работает только с массивами, и никто еще не нашел хорошего способа сделать это с общими диапазонами. Так что, к сожалению, константные диапазоны на этом этапе практически бесполезны.

0 голосов
/ 08 августа 2011

что если вы создадите отдельный сеттер для фронта:

@property T front() const { return this.buf[0]; }//const
@property void front(T t) { this.buf[0]=t; }//allows assign when needed

это то, что вам нужно?

...