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) 

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

您需要使用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(){ } 
+0

在哪里分配? – Arlen 2012-01-31 18:58:09

+0

哦,我明白了,忘了交换。看起来好像你没有得到实际的错误,尝试取消注释交换,你会得到一个新的错误:'错误:静态变量a不能在编译时引用',这似乎是实际的问题。此外'T ai = a;'给你一个不可变的结构。 – dav1d 2012-01-31 19:14:35

+0

好的。那么'T ai = a;'不应该给一个不变的。反正有没有这样的表现? – Arlen 2012-01-31 19:32:01