opIndex的正确实现是什么?

时间:2012-01-31 18:49:29

标签: d

struct A{

  int[3] _data;

  ref int opIndex(size_t i) { return _data[i]; }

  int opIndex(size_t i) const{ return _data[i]; }
}

T fun(T)(const ref T a){

  T ai = a;
  swap(ai[0], ai[1]);  // error
  return ai;
}

immutable A a = A();
immutable A b = fun(a);

void main(){ }

上面的代码给出了以下错误:

Error: ai.opIndex(0LU) is not an lvalue
Error: ai.opIndex(1LU) is not an lvalue
       called from here: fun(a)

aia的副本,它是左值,所以我不明白为什么会收到错误。

1 个答案:

答案 0 :(得分:2)

您需要使用opIndexAssign代替opIndex进行分配,而不是ref int opIndex(size_t i)使用int opIndexAssign(int value, size_t i)

您可以在此处找到更多信息:Operator Overloading

修改

import std.algorithm;

struct A{

  int[3] _data;

  ref int opIndex(size_t i) { return _data[i]; }
}

T fun(T)(){
  T ai;
  // swap(ai._data[0], ai._data[1]);
  swap(ai[0], ai[1]);
  return ai;
}

immutable A a = A();
immutable A b = fun!(A);

void main(){ }