opIndex的正确实现是什么?
问题描述:
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(){ }
上面的代码提供了以下错误:opIndex的正确实现是什么?
Error: ai.opIndex(0LU) is not an lvalue
Error: ai.opIndex(1LU) is not an lvalue
called from here: fun(a)
ai
是a
副本,它是一个左值,所以我不明白为什么我得到的错误。
答
您需要使用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(){ }
在哪里分配? – Arlen 2012-01-31 18:58:09
哦,我明白了,忘了交换。看起来好像你没有得到实际的错误,尝试取消注释交换,你会得到一个新的错误:'错误:静态变量a不能在编译时引用',这似乎是实际的问题。此外'T ai = a;'给你一个不可变的结构。 – dav1d 2012-01-31 19:14:35
好的。那么'T ai = a;'不应该给一个不变的。反正有没有这样的表现? – Arlen 2012-01-31 19:32:01