Program Club

std :: map에 const 접근자가없는 이유는 무엇입니까?

proclub 2020. 11. 9. 21:31
반응형

std :: map에 const 접근자가없는 이유는 무엇입니까?


std :: map의 [] 연산자에 대한 선언은 다음과 같습니다.

T& operator[] ( const key_type& x );

이것이 아닌 이유가 있습니까?

T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );

const 메서드에서 멤버 맵에 액세스해야 할 때마다 매우 유용하기 때문입니다.


operator[]in a map은 지정된 키의 값을 반환 하거나 아직 존재하지 않는 경우 해당 키에 대해 새로운 값 초기화 요소를 생성하므로 불가능합니다.

경우 operator[]const과부하, 요소를 추가하면 작동하지 않을 것입니다.

그것은 질문에 대한 답입니다. 대안 :

를 들어 C ++ 03 - 당신은 (이들은 반복자를 사용할 수 있습니다 const및 비 const결합 find). 에서 11 ++ C 당신이 사용할 수있는 at방법을.


C ++ 11 std::map::at부터는 const 및 non-const 액세스를 제공합니다.

반대로 요소가지도에 없으면 예외 operator[]std::out_of_range발생합니다.


이 대답은 operator[]키가 존재하지 않는 경우 키를 추가하는 의미가 있다는 점에서 정확 하지만 다른 관점을 추가하고 싶습니다.

공지 사항이 어떻게 operator[]다시 발생 T&. 즉, value에 연결된에 대한 참조를 반환합니다 key. 그러나에없는 key경우 map어떻게합니까? 무엇을 반환해야합니까? "널 참조"와 같은 것은 없으며 예외를 던지는 것은 성가시다.

이것은 안된다는 좋은 이유가 될 것 operator[] const입니다. map연산자가이므로 에 아무것도 추가 할 수 const없지만 존재하지 않는 항목을 찾고 있다면 사용자에게 무엇을 반환 할까요? 이 문제에 대한 좋은 해결책은 operator[] const.


(비 const) operator[]키가 없으면 생성합니다.

const해당 연산자 버전이 존재한다면 새 키를 추가 할 수 없기 때문에 다른 의미를 가져야합니다.

의미가 크게 다른 오버로드 를 갖는 const것과 const오버로드가없는 것은 웜이 될 수 있다는 데 동의 할 것 입니다. 따라서 const버전이 제공 되지 않습니다 .

find()하지만 const 멤버가 있으므로 코드에서 사용할 수 있습니다.


의 의미는 operator[]존재하지 않는 경우 키를 추가하기 때문입니다.

참고 URL : https://stackoverflow.com/questions/13902742/why-does-stdmap-not-have-a-const-accessor

반응형