C++ 如何提供对包装类的常量只读访问

C++ 如何提供对包装类的常量只读访问,c++,c++11,C++,C++11,我有以下程序。我想要完成的是在无序的_映射上创建一个对可变包装器的常量引用,我可以将其传递给只读查找。但是,由于运算符[]重载,我无法编译以下代码 从这段代码中,有人知道我做错了什么吗 #include <unordered_map> #include <string> using std::unordered_map; using std::string; class M { private: unordered_map<string, string&

我有以下程序。我想要完成的是在无序的_映射上创建一个对可变包装器的常量引用,我可以将其传递给只读查找。但是,由于运算符[]重载,我无法编译以下代码

从这段代码中,有人知道我做错了什么吗

#include <unordered_map>
#include <string>

using std::unordered_map;
using std::string;

class M {
private:
    unordered_map<string, string> m;

public:
    string const& operator[](string const& s) const {
        return m[s]; // line 13
    }

    string& operator[](string const& s) {
        return m[s];
    }
};

int main() {
    M m;

    m[string("a")] = string("answer_a");

    M const& m1 = m;
    string const& test = m1[string("a")];

    return 0;
}
#包括
#包括
使用std::无序_图;
使用std::string;
M类{
私人:
无序地图m;
公众:
字符串常量和运算符[](字符串常量和运算符)常量{
返回m[s];//第13行
}
字符串和运算符[](字符串常量和s){
返回m[s];
}
};
int main(){
M M;
m[字符串(“a”)]=字符串(“答案a”);
M常数&m1=M;
字符串常量和测试=m1[字符串(“a”)];
返回0;
}
错误(第13行)为

错误:传递'const std::无序\u映射, std::basic_string>'作为的'this'参数 'std::uu详细信息::u Map_ubase::mapped_utype&std:uu详细信息::Map_ubase::operator[](const u Key&) [使用Key=std::basic_string,Pair=std::Pair,std::basic_string>,Hashtable= std::_哈希表,std::对,std::基本字符串>, 分配器, std::basic_string>>,std:_Select1st,std::basic_string>>, 标准::等于>, std::hash>,, 标准::u详细信息::Mod_range_hashing, 标准::u详细信息::_默认值\u范围\u散列, 标准::u详细信息::Prime\uRehash\uPolicy,false,false,true>, std::_详细信息::_Map_base::mapped_type=std::basic_string]'丢弃限定符[-fppermissive]


无序的_映射运算符[]是非常量的,因为它在不存在映射键时添加了一个映射键。相反,您应该使用

return m.at(s);

无序的_映射运算符[]是非常量的,因为它在不存在映射键时添加了一个映射键。相反,您应该使用

return m.at(s);

你做错的是没有阅读文档以了解
操作符[]
对地图的作用。不过,我不会对这个问题投反对票,这是一个公平的问题,我敢肯定我们所有人以前都犯过这样的错误。特别是当第三个投票最多的问题是这样的时候。你犯的错误是没有阅读文档以了解
operator[]
对地图的作用。尽管如此,我不会否决这个问题,这是一个公平的问题,我敢肯定我们所有人以前都犯过这样的错误。特别是第三个投票最多的问题是什么时候。