使用C ++非常环保,我遇到了一些我不太了解的行为,即使用强烈的谷歌搜索也无法找到解释,所以我希望有人可以解释这里到底出了什么问题。
// test.h
#include <unordered_map>
typedef std::unordered_map<int, int> test_type;
class test
{
public:
static const test_type tmap;
};
// test.cpp
#include "test.h"
const test_type test::tmap = {
{ 1, 1 }
};
// main.cpp
#include "test.h"
int main()
{
// Attempt 1: access key via operator[]
std::cout << test::tmap[1];
// Attempt 2: access key via at()
std::cout << test::tmap.at(1);
return 0;
}
如果我的代码中有尝试1,Visual Studio的编译器坚持认为我使用的是尚未定义的二进制[
运算符,但这对我来说并不合理,因为就我而言知道没有二元[
运算符,(大括号总是一元的,对吧?)。
那么,为什么不尝试1工作?
答案 0 :(得分:7)
问题是std::unordered_map::operator[]
不是const
,因为它将指定的密钥插入到地图中(如果它尚不存在)。由于它不是const
,因此您无法将其与const
对象一起使用。 std::unordered_map::at
确实有const
超载,因此会编译。您需要将test
设为非const
,或者只使用at()
功能。