2012-06-15 4 views
18

std::map의 존재하지 않는 키에 연산자 []를 사용하여 액세스하려고하면 해당 키와 함께 새 요소가 삽입됩니다.지도 연산자 [] 및 값이 bool 인 경우

우리는이 : std::map<std::string, bool> map_xxx;

그것이 map_xxx["nonexistent_key"]의 존재하지 않는 키를 접속하여 그 보장, 두 번째 인수의 값은 항상 false 될 것인가?

ps. 아니야, 어떤 생각이라도이 행동을하는 법?

+0

나는 [이 페이지] (http://en.cppreference.com/w/)에 표시된 코드에서 알 수 있듯이 "bool()의 가치는 무엇입니까?" cpp/container/map/operator_at). – chris

+0

가능한 복제본 [std :: pair <>의 기본 생성자가 기본 유형 (int, etc)을 0으로 설정합니까?] (http://stackoverflow.com/questions/9025792/does-the-default-constructor-of -stdpair-set-basic-types-int-etc-to-zero) – ildjarn

답변

26

예. 삽입 할 값은 false입니다. 비 제로 초기화 클래스로 지정기구는 기본 초기화 호출 된 C++ 98


; 부울에 대해서는 false입니다.

C++ 03 이후의 메커니즘은 값 초기화라고하며, 비 클래스의 경우 0으로 초기화됩니다. 따라서 여전히 부울에 대해서는 false입니다. 예를 들어 C++ 14가 무엇을 말해야하는지 살펴 보겠습니다.

§23.4.4.3부터; "T"대신 bool을 대입하면됩니다.

T& 연산자 [] (CONST key_type & X);

  1. 효과 : 맵 X에 해당하는 키가없는 경우에는 맵에 VALUE_TYPE (X, T())를 삽입한다.
  2. 요구 사항 : key_type은 CopyInsertable이고 mapped_type은 DefaultInsertable이어야 * this가됩니다. §8.5에서

, 아래에서 위로 단락 다이제스트

대상물 또는 타입 T의 기준 제로 - 초기화 수단 :

- T 스칼라 타입인지 (3.9), 객체는 으로 얻어진 값으로 초기화되고 정수 리터럴 (영)에서 T;

...

을 값 초기화 형 T의 목적은 의미

- T 중 하나없는 기본 생성자와 (아마도 이력서 자격) 클래스 유형 (9 절) 인 경우 (12.1) 또는 사용자 제공 또는 삭제 된 기본 생성자이면 개체가 기본 초기화됩니다.

- T가 사용자 제공 또는 삭제 된 기본 생성자가없는 (가능하면 cv 한정) 클래스 유형 인 경우 객체는 0으로 초기화되고 기본 초기화에 대한 의미 적 제약 조건이 검사되며 T에 non-trivial 디폴트 생성자. 객체는 디폴트 초기화된다.

- T가 배열 유형이면 각 요소는 값으로 초기화됩니다.

- 그렇지 않은 경우 개체는 이며 0으로 초기화 됨입니다.

...

그 이니셜 빈} 인 목적, 즉 ()이어야한다 값을 초기화. §4.12 가입일

:

부재 유형 산술 범위가 지정되지 않은 열거 포인터 또는 포인터의 prvalue가 불리언 타입의 prvalue로 전환시킬 수있다. A 0 값, 널 포인터 값 또는 널 구성원 포인터 값 은 거짓으로 변환됩니다.; 다른 값은 true로 변환됩니다. 직접 초기화 (8.5)의 경우, std :: nullptr_t 유형의 prvalue는 bool 유형의 prvalue로 변환 될 수 있습니다. 결과 값은 false입니다.

관련 문제