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

标签 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

如果我尝试这样声明(不带 &):

var operator[] (int i) {

b[1] = ... 的赋值不会做任何事情(事实上它会赋值给一个临时变量,它是在索引位置 1 处找到的数组的拷贝并保持值“二”。

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

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

最佳答案

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

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

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

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

关于c++ - 在 operator[] 中混合引用和值行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31004927/

相关文章:

c++ - 当我超过第一个 getline() 的输入数组大小时,第二个 getline 或其他输入函数不起作用

c++ - Eclipse CDT 的额外重构

C++ 从文件中获取数据以记住上次 session

c++ - 使用 Winsock 创建 SSL 连接

c++ - 在 ARM 上的 Qt 中从 double 到 QString 的错误转换

c++ - 将 char* 输出到 std::string C++

c++ bash 添加到 PATH

c++ - 为什么矩阵没有正确初始化/打印?

c++ - 如何删除列表中的 pair<int,int> 元素

c++ - 具有 undefined reference 和重定位的简单程序被截断以适应错误