在operator []中混合引用和值行为

时间:2015-06-23 14:01:05

标签: c++

我需要来自operator[]的“双重”行为,有时它必须返回一个新的实例变量(又名“临时”),有时还会引用另一个变量,以便=赋值可用于结果

var &getItemAt(int i) {}
var &operator[] (int i) {
    if (this->isArray()) {
        return getItemAt(i);
    }
    var result = "undefined";
    return result; <-- Error: attempt to return a reference to a local variable
}

var a = 123; // var can be a number, array, string or 'undefined'
var b;
b.setType("array");
b.push("one", "two", "three");
b[1] = "new value"; // needs to be var& for the assignment to work

如果我尝试声明这样(没有&amp;):

var operator[] (int i) {

b[1] = ...的赋值将不执行任何操作(实际上它将分配给一个临时变量,该变量是在索引位置1找到的数组中的一个副本,并保持值为“2”。

但是如果我声明var & operator =数组语义完美,但我不能返回undefined或其他临时var。

如何将两种行为混合成一种?

2 个答案:

答案 0 :(得分:2)

您可以返回对静态变量的引用:

var &operator[] (int i) {
    if (this->isArray()) {
        return getItemAt(i);
    }
    static var result = "undefined";
    return result;
}

此变量将一直存在,直到程序终止,因此不会摇晃。

这正是boost::optionalstd::experimental::optional旨在解决的问题。

答案 1 :(得分:0)

很少有解决方案,但是静态&#39;在某些情况下,如果你想写回到新创建的对象,你需要在以后进行垃圾收集。所以&#39; undefined&#39;变量被分配,以GC为根,然后在GC内存释放转换期间被GC释放。

您还可以声明一个包装类,它在需要时表示数据或引用,并从功能中返回,但是您需要再次考虑如何释放分配的数据,可以通过引用计数。