运算符[]中混合引用和值行为

Mixing reference and value behavior in operator[]

本文关键字:引用 混合 运算符      更新时间:2023-10-16

我需要operator[]的"double"行为,有时它必须返回一个新的实例变量(也称为"临时"),有时还必须返回对另一个变量的引用,以便对结果使用=赋值。

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

如果我试图这样声明(没有&):

var operator[] (int i) {

分配给b[1] = ...将不起任何作用(事实上,它将分配给一个临时变量,该变量是在索引位置1找到的数组中的一个变量的副本,并保持值"2"

但是,如果我声明var & operator =,数组语义可以很好地工作,但我不能返回undefined或其他临时变量。

如何将两种行为合二为一?

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

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

这个变量将一直存在到程序终止,所以不会挂起。

这正是boost::optionalstd::experimental::optional想要解决的问题。

解决方案很少,尽管"static"在某些情况下有效,但如果您想写入返回的新创建的对象,则需要稍后对其进行垃圾收集。因此,"未定义"变量被分配,根在GC中,然后在GC的内存释放循环中被释放。

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