2017-10-16 29 views
0

일반적으로 STL 컨테이너는 참조와 같은 유형이 아닌 CopyAssignable을 보유 할 수 없습니다. 어떤 복사도 일어나지 않는 방식으로 컨테이너를 구성하면 코드가 유효합니다. gcc-7.2의 일부 버전을 사용하여 std=c++11c++14으로 컴파일되지만 다음과 같이 유효하거나 라이브러리 업그레이드로 중단 될 수 있습니까? 이 경우 reference_wrapper을 사용해야합니까?참조를 보유하는 unordered_map을 생성하는 것이 합법적입니까?


#include <unordered_map> struct S {}; void use (S&) {} void test() { S s1, s2; const std::unordered_map<int, S&> m{{0, s1}, {1, s2}}; use(m.at(0)); } 
편집는 정말 표준에 대한 참조를해야합니까. 컴파일러/표준 라이브러리의 표준을 준수하는 업데이트로 인해 코드가 손상 될 수 있다면 Works for me도 충분하지 않습니다. 그래서 "unordered_map with reference as value"에 주어진 답은 저에게 충분하지 않습니다.

+4

[값과 참조가있는 순서가 지정되지 않은 \ _map] 가능한 복제본 (https://stackoverflow.com/questions/24719044/unordered-map-with-reference-as-value) – davidhigh

+0

일반 컨테이너의 경우 구성에 CopyAssignable이 필요합니다 뿐만 아니라 많은 알고리즘이 예상대로 작동하지 않을 수 있습니다 – user463035818

답변

1

는 나는이 특정 사용 케이스에 대한 답변을 자신을 찾은 것 같아 :

특히 mapped_type에 대한 요구 사항을 나열하는 것을 생략 unordered_map도 요소 액세스를위한 절 23.5.4.3에서 C++11 표준, 즉, S&입니다 operator[]와 동안 DefaultConstructible이어야합니다.

mapped_type& at(const key_type& k); 
const mapped_type& at(const key_type& k) const; 

반환 : xk 등가 인 (고유) x.second 요소에 대한 참조.

예외 : 해당 요소가없는 경우 out_of_range 예외 개체가 발생합니다.

C++17 또한 26.5.4.3 및 26.5.4.4에서 간접적으로이 효과에 대해 말합니다.

따라서 위의 코드 이 표준 구현에서 작동해야합니다.

그러나, 그것은 사실이다 - 의견에서 지적 - 건설 후 컨테이너를 돌연변이 또는 건설 또는 컨테이너의이 value_type 또는 mapped_type 작동하지 않습니다 할당 필요로하는 알고리즘을 적용하는 것이다.