c++ - 如何在 C++ 中使用 [] 运算符获取对象

标签 c++ c++14

<分区>

我想使用 [] 运算符获取和设置测试类对象的值。但是出现以下错误:

lvalue required as left operand of assignment

提前致谢。

class Candidate {
    public:
    Candidate(string name):
        name(name) {}
    string name;
};

template<typename _key, typename _value>
class Test {
    _key key;
    _value value;
    public:
    _value operator[](_key key) {
        return this->value;
    }
};

int main() {
    Test<string, Candidate*> test;
    test["something"] = new Candidate("name");
    Candidate* candidate = test["something"];

    return 0;
}

最佳答案

对于这种使用,你需要按引用返回,而不是按值返回。

_value& operator[](_key key) {
    return this->value;
}

您还可以考虑在对象为 const 时添加重载。

_value const& operator[](_key key) const {
    return this->value;
}

按值返回会返回一个过期值,根据 C++ 中的赋值规则不能赋值给该值,除非该值明确允许这种赋值(这通常代表设计缺陷)。您必须返回一个左值或持久引用才能实际分配给它。

关于c++ - 如何在 C++ 中使用 [] 运算符获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547971/

相关文章:

c++ - 用于 boost 多索引容器的模板参数

c++ - OpenAcc标准中内核与并行指令之间的区别

c++ - SFINAE:函数模板优化

具有非静态成员初始值设定项的类的 C++11 聚合初始化

c++ - 在C++中的模板实例化中将带有构造函数的类用作类型参数

c++ - 打包修整的 C 结构

c++ - 有没有办法放置返回值?

c++ - static_if 会弃用模板特化吗?

c++ - 运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())

c++ - 将 boost::array<char> 复制到 std::string