2016-11-15 14 views
6

std :: tuple rvalue संदर्भों में विघटन क्यों करता है?std :: tuple rvalue संदर्भों में विघटन क्यों करता है

#include <tuple> 

template <typename, typename> struct same_type; 
template <typename T> struct same_type<T, T> {}; 

void foo() { 
    std::tuple tuple(1, 'a', 2.3, true); 
    auto[i, c, d, b] = tuple; 
    same_type<decltype(i), int &&>{}; 
    same_type<decltype(c), char &&>{}; 
    same_type<decltype(d), double &&>{}; 
    same_type<decltype(b), bool &&>{}; 
} 

यह जीसीसी ट्रंक का उपयोग कर त्रुटि के बिना संकलित करता है। मैं इसके बजाय सादे प्रकारों की अपेक्षा करता, उदा।

same_type<decltype(i), int>{}; 

Live example

उत्तर

9

जीसीसी बग। decltype एक संरचित बाध्यकारी रिटर्न पर लागू संदर्भित प्रकार, जो टुपल-जैसे केस std::tuple_element द्वारा लौटाया गया सटीक प्रकार है। दूसरे शब्दों में, भाषा इस तथ्य को छिपाने के लिए यहां बहुत कठिन प्रयास करती है कि वे वास्तव में संदर्भ हैं।

[dcl.type.simple]/4:

एक अभिव्यक्ति e के लिए, प्रकार decltype(e) से निरूपित किया के रूप में परिभाषित किया गया है इस प्रकार है:

  • अगर e एक unparenthesized आईडी अभिव्यक्ति नामकरण है एक संरचित बाध्यकारी ([ dcl.struct.bind]), decltype(e) संरचित बाध्यकारी घोषणा के विनिर्देश के अनुसार संदर्भित प्रकार है ;
  • [...]

[dcl.struct.bind]/3:

अन्यथा, अगर अभिव्यक्ति std::tuple_size<E>::value एक अच्छी तरह से गठित अभिन्न निरंतर अभिव्यक्ति है [...] प्रकार Ti नामित को देखते हुए std::tuple_element<i, E>::type द्वारा, प्रत्येक vi "Ti का संदर्भ" प्रारंभकर्ता के साथ आरंभ किया गया है, जहां वें ई संदर्भ एक lvalue संदर्भ है अगर प्रारंभकर्ता lvalue है और अन्यथा एक rvalue संदर्भ है; संदर्भित प्रकार Ti है।

+3

धन्यवाद। मैंने https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78358 को फिर से खोल दिया है – octoploid

संबंधित मुद्दे