2016-03-31 22 views
2

Aşağıdaki kodu bakınız nesneleri (o here canlı bakınız):Karışıklık

#include <iostream> 
#include <tuple> 
#include <type_traits> 
#include <utility> 

struct S { 
    int&& v; 
}; 

int main() { 
    std::tuple<int&&> t(1); 
    std::cout << std::is_same<int, decltype(std::get<0>(t))>{} << std::endl; 
    std::cout << std::is_same<int&, decltype(std::get<0>(t))>{} << std::endl; 
    std::cout << std::is_same<int&&, decltype(std::get<0>(t))>{} << std::endl; 
    S s{1}; 
    std::cout << std::is_same<int&&, decltype(s.v)>{} << std::endl; 
} 

Ben çıktı 0 0 1 1 görmeyi bekliyorum, ancak GCC ve çınlama hem çıktı 0 1 0 1 yerine verir. Gerçekten kafam karıştı. Birisi bana bir açıklama verebilir mi? std::get imzasıyla birlikte

cevap

3

Bak: Bu int& oldu int&& & dönmek böylece durumda t yılında

template< std::size_t I, class... Types > 
constexpr std::tuple_element_t<I, tuple<Types...> >& 
    get(tuple<Types...>& t) 

template< std::size_t I, class... Types > 
constexpr std::tuple_element_t<I, tuple<Types...> >&& 
    get(tuple<Types...>&& t) 

, bir L-değerdir. bağımsız değişken bir lvalue ise bir lvalue referans döndürülür ve bağımsız değişken bir rvalue ise bir rvalue referans döndürülür

template< std::size_t I, class... Types > 
typename std::tuple_element<I, tuple<Types...> >::type& 
get(tuple<Types...>& t); 

template< std::size_t I, class... Types > 
typename std::tuple_element<I, tuple<Types...> >::type&& 
get(tuple<Types...>&& t); 

Not:

+0

std :: tuple_element <0, std :: tuple > :: type & 'döndüren herhangi bir fikir' int & 'int &' + '&' int &? – James

+0

@Phantom: bak [kısa-açıklama-of-referans-çökmesi-kural] (http://stackoverflow.com/questions/13725747/concise-explanation-of-reference-collapsing-rules-requested-1-aa- 2) – Jarod42

+0

Teşekkür ederim. Tam olarak aradığım şey bu. – James

1

ilgili std::get aşırı yükler bunlar. t bir değerdir, bu nedenle bir değer döndürülür.