2016-07-28 36 views
1

我有一個擁有指向某些對象的唯一指針的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_statementconst修飾符,並使用循環將內容從一個向量移動到構造函數主體中的另一個向量。

但我想保留這個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修飾符?謝謝。

+1

不回答有關如何你的代碼工作的問題,但[這](http://stackoverflow.com/questions/18282204/proper-way-of-transferring-ownership-of-a-stdvector- stdunique-ptr-int-t)向您顯示移動向量的正確方法。 – NathanOliver

+0

你創建一個lambda,然後你調用它。聰明,雖然沒有必要。 – 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

相關問題