2015-02-10 8 views
13

से बाहर होना चाहिए मेरे पास कुछ कोड है जो वीएस2015 के तहत विफल रहता है, लेकिन जीसीसी के तहत काम करता है। मुझे यकीन है कि बग विजुअल स्टूडियो के साथ है लेकिन यह सुनिश्चित करना चाहते हैं कि decltype (ऑटो) की मेरी समझ सही है।अस्थायी से पहले बुलाया गया विनाशक

#include <iostream> 
using namespace std; 

string zero_params() 
{ 
    return "zero_params called."; 
} 

template< typename F > 
auto test1(F f) -> decltype(auto) 
{ 
    return f(); 
} 

int main() { 
    cout << std::is_rvalue_reference< decltype(test1(zero_params)) >::value << endl; 
    cout << test1(zero_params) << endl; 

    cout << "Done!" << endl; 
    return 0; 
} 

विजुअल स्टूडियो के तहत शून्य_परैम्स द्वारा लौटाई गई स्ट्रिंग को एक रावल्यू संदर्भ माना जाता है। इसके अलावा उस वस्तु के विनाशक को test1() के अंदर बुलाया जाता है जहां कॉल से एफ में वापसी होती है (जो & & ऑब्जेक्ट को नष्ट करने के लिए उचित स्थान लगता है)।

जीसीसी के तहत वापस स्ट्रिंग को एक रावल्यू संदर्भ के रूप में नहीं लिया जाता है। जैसा कि मैं उम्मीद करता हूं, कोउट कथन में उपयोग के बाद विनाशक को बुलाया जाता है।

विजुअल स्टूडियो के तहत decltype (auto) के बजाय वापसी प्रकार को 'स्ट्रिंग' निर्दिष्ट करने के लिए इसे ठीक करता है, जैसा कि test1 के अंदर f() की वापसी पर remove_reference_t का उपयोग करता है।

मेरे उम्मीद होगी कि जीसीसी सही है के रूप में zero_params के लिए समारोह हस्ताक्षर() स्ट्रिंग, नहीं स्ट्रिंग है & & तो मैं 'बबल सामने' test1 की वापसी प्रकार के लिए करने के लिए गैर संदर्भ उम्मीद होती है अगर यह decltype का उपयोग करता है (ऑटो)।

क्या यह एक सही मूल्यांकन है?


देर संपादित करें:

cout << test1(zero_params) << endl; 

लिए:

एक और तरीका है मैं VS2015 के साथ इस के आसपास पाने के लिए मिल गया है समारोह एक लैम्ब्डा में Test1 को दिया रैप करने के लिए है

cout << test1([](auto&&... ps) { return zero_params(std::forward<decltype(ps)>(ps)...); }) << endl; 
+5

दाएं, 'एफ()' एक प्रचलित है, इसलिए 'decltype' 'std :: string &&' की बजाय 'std :: string' को कम करना चाहिए। –

+3

कृपया [एमएस कनेक्ट] (https://connect.microsoft.com/VisualStudio/) पर एक बग रिपोर्ट दर्ज करें और यहां लिंक पोस्ट करें। वीआर2015 आरटीएम पर जाने से पहले यह _really_ तय किया जाना चाहिए यदि 'decltype (auto)' बेकार के अलावा कुछ भी हो ... – ildjarn

+0

दुर्भाग्य से एमएस कनेक्ट मुझे बताता है कि मैं बग रिपोर्ट सबमिट करने के लिए अधिकृत नहीं हूं। हालांकि विजुअल स्टूडियो के भीतर मैंने पहले से ही सबसे अच्छी चीज की है - विवरण के साथ टेस्ट कोड के स्क्रीनशॉट सहित उनके 'डरावनी चेहरे' का उपयोग करके फीडबैक सबमिट किया है। दुर्भाग्य से मुझे नहीं लगता कि यह विधि ट्रैक करने योग्य है? उम्मीद है कि कोई इसे सही विभाग – qeadz

उत्तर

2

तो based on the comments हम निष्कर्ष निकाल सकते हैं:

  • यह VS2015 पूर्वावलोकन में एक बग है
  • वहाँ समाधान
  • हैं bug has been reported

बग है जो:

  • संकलक वापसी प्रकार निष्कर्ष निकाला जाना चाहिए था स्ट्रिंग होने के लिए
  • यह वास्तव में इसे स्ट्रिंग & & होने के लिए प्रेरित करता है
  • इस प्रकार यह मूल्य नष्ट समय से पहले ही

कामकाज से जुड़े हैं:

  • फ़ंक्शन द्वारा दिया गया प्रकार
  • लपेटें पार करने से पहले एक लैम्ब्डा अभिव्यक्ति में समारोह के लिए decltype (ऑटो) का उपयोग न करें
+0

में संशोधन कर सकता हूं क्या हम उन टिप्पणियों को इस उत्तर में एकीकृत कर सकते हैं? टिप्पणियाँ अस्थायी हैं। –

+1

https://connect.microsoft.com/VisualStudio/feedback/details/1124457/decltype-auto-deducing-wrong-type-in-some-cases –

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

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