2016-06-11 8 views
5

emplace() 및 친구와 관련하여보다 미세한 점 중 하나를 놓치고 있어야합니다. 여기서 4.9.3 ++ g의 문제점을 재생하는 전체 최소 예제 :g ++ 4.9.3은 femplended ctor가 .emplace_back()과 함께 개인적인 것으로 불평하지만 .push_back()을 좋아합니다.

class Foo 
{ 
public: 
    class Bar 
    { 
    private: 
    friend class Foo; 
     Bar(Foo &foo) : foo(foo) {} 
     Foo &foo; 
    }; 

    Bar &getBar() 
    { 
     //bars.push_back(*this);  // works fine 
     bars.emplace_back(*this);  // Foo::Bar::Bar(Foo&) is private 
     return bars.back(); 
    } 
private: 
    std::vector<Bar> bars; 
}; 
+3

편집을 롤백했습니다. 답변을 받으면 질문을 변경하지 마십시오. 새로운 질문이있는 경우 새로운 질문을 게시하십시오. – Barry

답변

10

emplace_back에서, 컨테이너가 Bar 구축 한 것이다. 하지만 생성자는 비공개이고 컨테이너는 친구가 아니므로 실패합니다.

그러나 push_back(*this)push_back(Bar(*this))과 같습니다. 즉, 건설을하고 있으며 친구 인 것은 Foo입니다.

+0

인상적. 컨테이너를 친구로 만드는 방법에 대한 의견이 있으십니까? – Steger

+0

@Steger 작동을 보증 할 수 없습니다. 건설을 수행하는 불특정 기본 클래스가 될 수 있기 때문입니다. – Barry

2
bars.emplace_back(*this); 

std::vector::emplace_back()에 생성자 Bar(Foo&)에 대한 호출을 지연. 이 함수에는 Bar(Foo&)을 호출 할 수있는 액세스 권한이 없습니다. 한편

,

bars.push_back(*this); 

std::vector::push_back()에 대한 호출하기 전에 생성자 Bar(Foo&)를 호출합니다. FoofriendBar이므로 문제가되지 않습니다.