2013-11-21 96 views
3

這個示例代碼應該編譯? clangg++接受它,而icc 14拒絕這樣做,抱怨auto t = ...std::unique_ptr的複製構造函數未定義。C++ 11 - 元組和移動語義

#include <iostream> 
#include <memory> 
#include <tuple> 

std::tuple<std::unique_ptr<int[]>, int> foo() 
{ 
    std::unique_ptr<int[]> a; 
    unsigned int b; 
    auto t = std::make_tuple(std::move(a), b); 
    return std::move(t); 
} 

int main() 
{ 
    foo(); 
} 
+0

返回rvalues有什麼問題? – akappa

+0

但我要返回一個'T',而不是'T &&'。我認爲它應該是安全的無論如何 – akappa

+0

對不起,沒有注意到。 :) – 0x499602D2

回答

6

我想它應該編譯:從std::make_tuple()結果是一個臨時std::tuple<T...>並且它應該是移動構建其成員。更確切地說,std::tuple<T...>的移動構造函數是默認應該導致成員移動的構造。

顯然,沒有必要將std::make_tuple()的結果分配給t。如果選擇引入此變量,則在返回時不應該返回std::move(t):當return語句中的表達式是局部變量時,它將被視爲無論如何都是右值。但是,額外的std::move()禁止複製/移動省略。

+1

但是,額外的std :: move()禁止複製/移動elision。 +1 – ScarletAmaranth

+1

因此,Intel的編譯器並不像C++ 11就緒,因爲他們做廣告,畢竟 – akappa

+3

@akappa:它可能是編譯器,它可能是庫。你可能想創建一個根本不使用庫的測試用例,而是使用一個'struct'和一個默認的移動構造函數,該構造函數包含一個'std :: unique_ptr '並且看看它是如何工作的。 –