我有一個擁有指向某些對象的唯一指針的const vector
成員的類。構造時,sequence
對象應該竊取傳遞給構造函數的唯一指針向量的所有權,以便序列對象現在是由vector參數中的唯一指針所擁有的對象的所有者。C++在初始化程序列表中爲嵌入lambda的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
,因此可以」 t複製 - 構建一個vector
。
C++不允許在構造函數的主體中初始化const成員(如Java對最終成員所做的那樣),但僅限於初始化程序列表中。因此,一種可能的解決方案是刪除m_statement
的const
修飾符,並使用循環將內容從一個向量移動到構造函數主體中的另一個向量。
但我想保留這個const
修飾符。
所以我想出了另一個似乎可以編譯的解決方案,但是因爲我是C++ 11的新手,我不確定它的功能。我們的想法是將上述循環嵌入到lambda函數中,以便我可以使用循環在初始化程序列表中初始化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;
})())
{
}
這個編譯。但是我不確定從lambda函數的return語句開始會發生什麼。
我假設拷貝的copied_vec已經完成並返回。當按值返回唯一指針的向量時會發生什麼?這是一種正確的方式來做我想做的事,儘管很奇怪,或者我必須放棄m_statetent
上的const
修飾符?謝謝。
不回答有關如何你的代碼工作的問題,但[這](http://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- stdunique-ptr-int-t)向您顯示移動向量的正確方法。 – NathanOliver
你創建一個lambda,然後你調用它。聰明,雖然沒有必要。 – lorro
@NathanOliver謝謝。我無言以對,看它有多簡單。 – Virus721