2017-04-19 1 views
0
struct Foo { 
    Foo(int a, int b) : a_(a), b_(b) {} 
    int a_; 
    int b_; 
}; 

int main() 
{ 
    vector<Foo> vec; 
    vec.emplace_back(1, 2); 
} 

위 코드는 emplace_back이 Foo 객체를 생성하기 때문에 컴파일됩니다.C++ map emplace

int main() 
{ 
    map<int, Foo> m; 
    m.emplace(1, 2, 3); 
} 

위의 코드는 컴파일되지 않습니다. 왜 emplace은 args 23을 사용하여 자리에 Foo을 생성하지 않습니까? Foo 생성자에 1 개의 arg가 있으면 위 스타일이 작동합니다.

gcc 4.9.2를 사용하고 있습니다. 최신이 아닙니다. 누구든지 위의 코드가 나중에 컴파일러에서 컴파일 될 것이라고 생각합니까?

+0

페이지의 [이] (http://stackoverflow.com/q을 수행 할 수 있습니다/27960325/241631), 아마도 중복 된 – Praetorian

답변

0

mapvalue_typestd::pair<const int, Foo>입니다. pair에는 개의 인수를 취하는 constructor이 없습니다.

당신은

m.emplace(1, Foo(2, 3)); 

아니면 정말 Foo의 이동 생성자를 호출하지 않으려면,

m.emplace(std::piecewise_construct, 
      std::make_tuple(1), 
      std::make_tuple(2, 3));