我需要来自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。
如何将两种行为混合成一种?
答案 0 :(得分:2)
您可以返回对静态变量的引用:
var &operator[] (int i) {
if (this->isArray()) {
return getItemAt(i);
}
static var result = "undefined";
return result;
}
此变量将一直存在,直到程序终止,因此不会摇晃。
这正是boost::optional
和std::experimental::optional
旨在解决的问题。
答案 1 :(得分:0)
很少有解决方案,但是静态&#39;在某些情况下,如果你想写回到新创建的对象,你需要在以后进行垃圾收集。所以&#39; undefined&#39;变量被分配,以GC为根,然后在GC内存释放转换期间被GC释放。
您还可以声明一个包装类,它在需要时表示数据或引用,并从功能中返回,但是您需要再次考虑如何释放分配的数据,可以通过引用计数。