2013-04-17 2 views
1

아래 코드를 참조하십시오. const 템플릿 유형을 사용합니다. 첫 번째 줄이 컴파일되고 다른 두 줄은 컴파일되지 않습니다. 왜 그 둘은 컴파일되지 않습니까? 컴파일 된 첫 번째 파일은 쓸 수 있습니까? std::map<const int, const bool>std::map<int, bool>의 차이점은 무엇입니까?const 템플릿 및 const 참조 템플릿 매개 변수가있는 std :: map

std::map<const int, const bool> mm; 
std::map<const int&, const bool> mm; 
std::map<const int, const bool&> mm; 

이상한 질문이지만이를 명확히하는 데 도움이됩니다.

+0

나는 그 값을 이해할 수 있지만 열쇠는 아니다! 당신이'myMap [key] = value;를 쓰는 것을보십시오. 그러므로 값은 참조 형일 수 없습니다. 열쇠는? – Narek

+0

std :: maps에서 참조를 사용할 수 없습니다. http://stackoverflow.com/questions/4239253/c-is-it-possible-to-use-a-reference-as-the-value-in-a-http : map – Akobold

+0

왜? 그렇지 않다면? 왜 컴파일 오류가 발생합니까? – Narek

답변

2

const 값이 있습니까? map::value_type은 실제로 std::pair<const Key, Value>입니다. containter에 any 참조를 저장할 수 없습니다.

표준의 요구 사항 중 하나.

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

이 필요합니다 key_typeCopyInsertable이어야하며 mapped_type *은 이것으로 DefaultInsertable한다.

그러나, const referenceCopyInsertable이 아닙니다.

+0

왜 std :: vector에서 ctor no 만 복사해야합니까? 그리고 연관 컨테이너에는 copy ctor와 operator <()가 필요합니다. – Narek

+0

@ Narek : 벡터는 요소를 복사하거나 이동해야하기 때문에; 한편 (정렬 된) 연관 컨테이너는 순서를 결정하기 위해 그것들을 비교해야한다. –

+1

가장 엄격한 요구 사항을 가진'operator []'을 선택했습니다. 당신은'operator []'를 사용하지 않고 맵을 사용할 수 있으며'DefaultInsertable'에 대한 필요성은 사라질 것입니다 ... –

관련 문제