2013-08-18 82 views
6

std::tuple包含,除其他外,以下的構造:所有的std :: tuple構造函數都是必需的嗎?

explicit tuple(const Types&... args); 

template< class... UTypes > 
explicit tuple(UTypes&&... args); 

兩者在它們初始化每個與args對應的值的元素等效的描述。唯一的區別是在第二個參數被轉發。

從我對rvalue引用的理解中,我不明白爲什麼第一個版本是必需的,因爲可以將相同的參數傳遞到第二個版本。這些引用將被轉發,沒有人會更聰明,尤其是沒有提到移動語義。

任何人都可以解釋它是什麼使得兩個構造函數都是必需的嗎?

+3

第二個版本是SFINAE-d出過載如果不是全部設置的'UTypes'是隱式轉換爲對應的'Types' – jrok

回答

10

下面是一個簡單的例子:

template <typename T> 
struct foo 
{ 
    foo(const T&); 
    template <typename U> 
    foo(U&&); 
}; 

第二個構造需要某種模板類型扣。這在所有情況下都不起作用,例如與初始化列表。如果第一個構造函數可用,以下初始化僅適用:

auto f = foo<std::vector<int>>{ { 1, 2, 3 } }; 
0

這是用於RValue參考轉發,並針對移動構建進行了優化。第一個版本用於左值。請參閱以下鏈接以更好地解釋。

http://thbecker.net/articles/rvalue_references/section_07.html

+4

第二個版本可以用於rvalue引用以及用於左值的引用。 – nosid

+0

同意,但編譯器將在編譯時作出函數簽名的最佳選擇,在這種情況下,它們提供了2個簽名。我同意你的回答,以及它有助於模板扣除,並因此需要。 – bjackfly

相關問題