2016-07-28 8 views
1

어떤 개체에 대한 고유 포인터를 보유하는 const vector 멤버가있는 클래스가 있습니다. 생성 될 때 sequence 객체는 생성자에 전달되는 고유 포인터 벡터의 소유권을 훔쳐 야하므로 시퀀스 객체는 이제 벡터 매개 변수의 고유 포인터가 소유 한 객체의 소유자가됩니다.C++ const 벡터 멤버의 이니셜 라이저 목록에 람다 포함

class sequence 
{ 
    const std::vector< std::unique_ptr<statement> > m_statements; 

    sequence(std::vector< std::unique_ptr<statement> > & statements); 
}; 

내가 생성자를 구현하려고 처음으로, 나는 한 다음

sequence::sequence(vector< unique_ptr<statement> > & statements) 
    m_statements(statements) 
{ 
} 

그러나 하나 따라서 unique_ptr을 복사 구성하고 수 없기 때문에이 컴파일되지 않습니다 물론 할 수 있습니다 ' 사본을 vector으로 복사하십시오.

C++에서는 생성자 본문에있는 const 멤버를 초기화 할 수 없습니다 (Java는 최종 멤버로 수행합니다).하지만 이니셜 라이저 목록 내에서만 가능합니다. 따라서 가능한 해결책은 const 수정자를 m_statement으로 놓고 루프를 사용하여 한 벡터의 내용을 생성자 본문의 다른 벡터로 이동하는 것입니다.

하지만이 값을 유지하고 싶습니다. const 수정 자.

그래서 나는 컴파일하는 것처럼 보이는 해결책을 생각해 냈습니다. 그러나 C++ 11에 익숙하지 않았기 때문에 나는 그것이 어떤 일을하는지 확실하지 않습니다. 루프를 사용하여 이니셜 라이저 목록 내에서 m_statement을 초기화하고 const 수정자를 계속 유지할 수 있도록 위의 루프를 람다 함수에 포함시키는 것이 아이디어였습니다. m_statement.

sequence::sequence(vector< unique_ptr< const statement > > & statements) : 
    m_statements(([ & statements ] { 
     vector< unique_ptr< const statement > > copied_vec; 
     for(auto & stm : statements) 
      copied_vec.push_back(move(stm)); 
     return copied_vec; 
    })()) 
{ 
} 

이 컴파일됩니다. 그러나 나는 람다 함수의 return 문에서 시작하여 어떤 일이 일어나는지 확실하지 않습니다.

나는 copied_vec의 복사본을 만들어 반환했다고 가정합니다. 고유 한 포인터 벡터를 값으로 반환하면 어떻게됩니까? 이상한 것임에도 불구하고 내가 원하는 것을 수행하는 올바른 방법입니까 아니면 const 수정자를 m_statetent에 놓아야합니까? 고맙습니다.

+1

은 [이] (http://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- 방법 코드를 작품에 대한 질문에 대답 만하지 않습니다 stdunique-ptr-int-t)는 벡터를 '이동'시키는 올바른 방법을 보여줍니다. – NathanOliver

+0

람다를 만든 다음 호출합니다. 영리, 불필요 함. – lorro

+0

@ NathanOliver 감사합니다. 나는 그것이 얼마나 간단한 지 알기 위해 말문이있다. – Virus721

답변

6

이동 생성자를 사용할 수없는 이유가 누락 되었습니까?

sequence::sequence(vector< unique_ptr<statement> > && statements) 
    m_statements(std::move(statements)) 
{ 
} 
+0

도움 주셔서 감사합니다. 나는 그것에 대해 생각하지 않았다. 비록 내가 여전히 가치로 반환을 사용하여'copied_vec'를 복사 할 때 어떤 일이 일어나는지 알고 싶습니다. – Virus721

+0

"세부 정보"에 따라 어떤 형태의 RVO를 얻을 가능성이 높습니다. 나는 C++ 17에서 세부 사항에 따라 위임 된 것조차한다고 생각한다. – KayEss

+0

감사합니다. 그런 종류의 암시적인 컴파일러 최적화를 무시하면 고유 한 포인터 벡터를 복사 할 때 어떤 일이 발생합니까? 소유권은 소스 벡터의 포인터에서 새롭게 생성 된 벡터의 포인터로 넘어갑니다. – Virus721