通过operator []访问静态成员unordered_map

时间:2015-06-11 17:57:15

标签: c++

使用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工作?

1 个答案:

答案 0 :(得分:7)

问题是std::unordered_map::operator[]不是const,因为它将指定的密钥插入到地图中(如果它尚不存在)。由于它不是const,因此您无法将其与const对象一起使用。 std::unordered_map::at确实有const超载,因此会编译。您需要将test设为非const,或者只使用at()功能。