오른쪽의 예외에도 불구하고 C ++에서 할당이 발생합니다.
다음과 같은 (C ++ 14) 코드가 있습니다.
map<int, set<string>> junk;
for (int id : GenerateIds()) {
try {
set<string> stuff = GetStuff();
junk[id] = stuff;
} catch (const StuffException& e) {
...
}
}
작동합니다. 때때로 GetStuff()예외가 발생합니다. 예외가 발생하면 정크 맵에 값을 원하지 않기 때문입니다.
그러나 처음에는 작동하지 않는 루프에 이것을 작성했습니다.
junk[id] = GetStuff();
보다 정확하게 GetStuff()는 예외 junk[id]가 발생 하더라도 생성되고 빈 집합이 할당됩니다.
이것은 내가 기대했던 것이 아닙니다. 나는 그들이 같은 방식으로 작동 할 것으로 기대합니다.
내가 여기서 오해 한 C ++의 원리가 있습니까?
C ++ 17 이전에는 할당 연산자의 왼쪽과 오른쪽 사이에 시퀀싱이 없었습니다.
명시 적 시퀀싱이 도입 된 것은 C ++ 17에서 처음입니다 (오른쪽이 먼저 평가됨).
이는 평가 순서가 지정되지 않았 음 을 의미합니다. 즉, 원하는 순서대로 평가를 수행하는 것은 구현에 달려 있으며이 경우 왼쪽을 먼저 평가합니다.
자세한 내용은 이 평가 순서 참조 를 참조하십시오 (특히 포인트 20).
std :: map :: operator []
키에 해당하는 키에 매핑 된 값에 대한 참조를 반환하여 해당 키가 아직없는 경우 삽입을 수행합니다.
junk[id]위에서 언급 한 삽입이 발생하고 이미 발생한 후 발생합니다 GetStuff(). C ++ 14에서 이러한 일이 발생하는 순서는 구현 정의이므로 다른 컴파일러를 사용 junk[id] = GetStuff();하면 GetStuff()throw되는 경우 삽입을 수행하지 않을 수 있습니다 .
에서 어떻게 operator[]작동 하는지 오해 하고 std::map있습니다.
매핑 된 항목에 대한 참조를 반환합니다. 따라서 코드는 먼저 해당 위치에 기본 항목을 삽입 한 다음 operator=새 값을 설정하도록 호출 합니다.
이 작업을 예상대로 작동하려면 std::map::insert(*) 를 사용해야합니다 .
junk.insert(std::make_pair(id, GetStuff()));
주의 사항 : 아직 매핑되지 않은 insert경우에만 값을 추가합니다 id.
'Programing' 카테고리의 다른 글
| Python Pandas는 선택한 열의 행별 최대 값에 대한 열을 추가합니다. (0) | 2020.10.27 |
|---|---|
| 자바 : NIO와 NIO.2의 차이점은 정확히 무엇입니까? (0) | 2020.10.27 |
| 확장 방법을 식별하기위한 반영 (0) | 2020.10.27 |
| Asp.Net MVC PDF를 생성하기 위해보기를 얻는 방법 (0) | 2020.10.27 |
| 시스템에 설치된 애플리케이션 가져 오기 (0) | 2020.10.27 |