2017-10-06 4 views
1

std::reference_wrapper으로 실험 중입니다.값 유형이 reference_wrapper 인 경우 unordered_map 값 지정

#include <functional> 
#include <vector> 
#include <unordered_map> 

using namespace std; 

int main() 
{ 
    vector<vector<long>> x; 

    vector<reference_wrapper<vector<vector<long>>>> y; 
    y.push_back(ref(x)); // OK 

    unordered_map<string, reference_wrapper<vector<vector<long>>>> m; 
    m["lol"] = ref(x); // NOT OK 
} 

이것은 컴파일 오류가 나는

/usr/include/c++/7.2.0/tuple:1652:70: error: no matching function for call to ‘std:: 
reference_wrapper<std::vector<std::vector<long int> > >::reference_wrapper()’  
     second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...) 
                    ^
In file included from /usr/include/c++/7.2.0/bits/std_function.h:44:0,    
       from /usr/include/c++/7.2.0/functional:58,       
       from test.cpp:1:   
/usr/include/c++/7.2.0/bits/refwrap.h:325:7: note: candidate: constexpr std::referen 
ce_wrapper<_Tp>::reference_wrapper(const std::reference_wrapper<_Tp>&) [with _Tp = s 
td::vector<std::vector<long int> >]  
     reference_wrapper(const reference_wrapper&) = default;      
     ^~~~~~~~~~~~~~~~~ 
/usr/include/c++/7.2.0/bits/refwrap.h:325:7: note: candidate expects 1 argument, 0 
provided    
/usr/include/c++/7.2.0/bits/refwrap.h:319:7: note: candidate: std::reference_wrapper 
<_Tp>::reference_wrapper(_Tp&) [with _Tp = std::vector<std::vector<long int> >]  
     reference_wrapper(_Tp& __indata) noexcept          
     ^~~~~~~~~~~~~~~~~ 
/usr/include/c++/7.2.0/bits/refwrap.h:319:7: note: candidate expects 1 argument, 0 
provided 

누군가가 내가 잘못 뭐하는 거지 설명 할 수 얻을 다음은 std::unordered_map에 대한 std::vector 아니라 작업 않는 이유를 이해가 안 돼요?

답변

5

m["lol"]은 순서가 지정되지 않은 맵 operator[]을 사용합니다. 해당 연산자는지도의 항목에 대한 참조를 반환합니다. 그런 품목이 없다면 문제가 될 수 있습니다.

이를 해결하기 위해 반환 할 항목을 기본값으로 구성합니다. std::reference_wrapper은 기본 구성 가능하지 않기 때문에 여기에 문제가 있습니다.

두 예제를 더 비슷하게 만들려면 std::unordered_map::insert 또는 std::unordered_map::emplace을 사용해야합니다.

+0

아! 말이된다! 그냥'm.insert ({ "lol", ref (x)});와 함께 시도하고 효과가있었습니다. 감사 :) – valentin