어떤 개체에 대한 고유 포인터를 보유하는 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
에 놓아야합니까? 고맙습니다.
은 [이] (http://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- 방법 코드를 작품에 대한 질문에 대답 만하지 않습니다 stdunique-ptr-int-t)는 벡터를 '이동'시키는 올바른 방법을 보여줍니다. – NathanOliver
람다를 만든 다음 호출합니다. 영리, 불필요 함. – lorro
@ NathanOliver 감사합니다. 나는 그것이 얼마나 간단한 지 알기 위해 말문이있다. – Virus721