运算符[]中混合引用和值行为
Mixing reference and value behavior in operator[]
我需要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::optional
和std::experimental::optional
想要解决的问题。
解决方案很少,尽管"static"在某些情况下有效,但如果您想写入返回的新创建的对象,则需要稍后对其进行垃圾收集。因此,"未定义"变量被分配,根在GC中,然后在GC的内存释放循环中被释放。
您还可以声明一个包装类,该包装类在需要时表示数据或引用,并从函数中返回,但您需要再次考虑如何释放分配的数据,可能是通过引用计数。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- 混合 C 和 C++.. 对函数的未定义引用
- 混合转换指针和引用
- 结构化绑定和转发引用是否混合良好?
- 重值引用不是将类型和类别混合在一起吗?
- 模板功能:混合逐个复制传递和按引用传递
- 在OpenMPI中混合使用“英特尔C++”和“Fortran”时未定义的引用
- 混合按引用传递和按值传递到可变参数模板函数有效
- 如何混合C++共享指针和对象引用
- 期望输出带有指针和引用混合的代码
- 混合编译gfortran和g++时未定义的引用
- c++中函数定义中指针和引用的混合
- C++/Fortran 混合编程:对"_gfortran_reshape_r8"的未定义引用
- 运算符[]中混合引用和值行为
- Android NDK 混合 C 和 C++ 错误未定义对 mult(int, int) 的引用