2015-06-11 3 views
4

Будучи совершенно зеленым с C++, я столкнулся с поведением, которое я не совсем понимаю, и не смог найти объяснения даже при интенсивном поиске в Google, поэтому я надеялся, что кто-то сможет объясните, что именно здесь неправильно.Доступ к статическому члену unordered_map с помощью оператора []

// 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 работа?

+3

Скобки двоичные, первым параметром является unordered_map, а второй - ключ (1). –

+0

_ "Если я определяю карту вне класса, метод operator [] работает так, как ожидалось" _ Does it? Ты уверен? –

+0

@LightnessRacesinOrbit Ну да: http://cpp.sh/4dab – Schlaus

ответ

7

Проблема std::unordered_map::operator[] не const, поскольку она вставляет указанный ключ на карту, если она еще не существует. Так как это не const, вы не можете использовать его с объектом const. std::unordered_map::at имеет const перегрузки, поэтому он компилируется. Вам либо нужно сделать test не const, либо просто использовать функцию at().

+2

Лучше сказать 'const', чем« константа ». Последнее может означать ожидания, которые не соответствуют первому, который имеет четкую, конкретную и четко определенную семантику. –

+0

@LightnessRacesinOrbit Спасибо за это. Я обновил ответ. – NathanOliver

+0

А, я знал, что это было что-то простое, что я забыл. Спасибо! – Schlaus

Смежные вопросы