2013-07-07 12 views
8

मैं निम्नलिखित परीक्षण कार्यक्रम है:अस्थाई स्थिरांक सरणी rvalue संदर्भ के लिए बाध्य नहीं

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

template<typename Ty, std::size_t N> 
void foo(Ty (&&)[N]) 
{ 
    std::cout << "Ty (&&)[" << N << "]\t" << std::is_const<Ty>::value << '\n'; 
} 

template<typename Ty, std::size_t N> 
void foo(Ty (&)[N]) 
{ 
    std::cout << "Ty (&)[" << N << "]\t" << std::is_const<Ty>::value << '\n'; 
} 

template<typename Ty> 
using id = Ty; 

int main() 
{ 
    std::cout.setf(std::cout.boolalpha); 

    foo(id<int[]>{1, 2, 3, 4, 5}); 
    foo(id<int const[]>{1, 2, 3, 4, 5}); // <-- HERE. 
    int xs[]{1, 2, 3, 4, 5}; 
    foo(xs); 
    int const ys[]{1, 2, 3, 4, 5}; 
    foo(ys); 
    foo(std::move(xs)); 
    foo(std::move(ys)); 
} 

मैं उम्मीद होती है कि लाइन एक तीर के साथ चिह्नित बस इसे ऊपर गैर स्थिरांक कॉल की तरह rvalue अधिभार कहेंगे लेकिन यह नहीं करता है

क्या यह सिर्फ जीसीसी में एक बग है या मानक में कुछ ऐसा है जो lvalue अधिभार का चयन करने का कारण बनता है?

+0

दिलचस्प, क्लैंग यह सही हो जाता है और रावल ओवरलोड को कॉल करता है। – Xeo

+0

अच्छा सवाल: मानक की मेरी बेवकूफ समझ आपके साथ सहमत है। [लाइव] (http://ideone.com/ErHuYO) यदि आप आउटपुट देखना चाहते हैं। – Yakk

+0

यहां कुछ मजाकिया चल रहा है: http://ideone.com/ptTJ8i - मेरा 'const int' अस्थायी 'int &&' की तरह व्यवहार किया जा रहा है, न कि 'const int &&'। – Yakk

उत्तर

2

के अनुसार मानक §12.2 [class.temporary]:

वर्ग प्रकार के temporaries विभिन्न संदर्भों में बनाई गई हैं: एक prvalue (8.5.3) के लिए एक संदर्भ बंधन, एक prvalue (6.6.3) लौटने, एक रूपांतरण जो एक प्रबल (4.1, 5.2.9, 5.2.11, 5.4) बनाता है, एक अपवाद (15.1) फेंकने, एक हैंडलर (15.3) में प्रवेश करते हुए, और कुछ प्रारंभिकरण (8.5) में।

तो id<int const[]>{1, 2, 3, 4, 5} एक अस्थायी है और इसलिए एक prvalue §3.10 [basic.lval] है:

एक rvalue (हां, तो कहा जाता है ऐतिहासिक दृष्टि से, क्योंकि rvalues ​​ एक काम अभिव्यक्ति की दाएँ हाथ की ओर पर दिखाई दे सकता है) एक है xvalue, अस्थायी वस्तु (12.2) या इसके उपरोक्त, या एक मान जो किसी ऑब्जेक्ट से संबद्ध नहीं है।

एक प्रावधान ("शुद्ध" रावल्यू) एक ऐसा अंडाकार है जो xvalue नहीं है।

इसलिए रावल्यू संदर्भ तर्क के साथ ओवरलोडेड फ़ंक्शन का चयन किया जाएगा।

+0

तो मूल रूप से यह जीसीसी में एक बग है? – Mehrdad

+0

@ मेहरदाद: मुझे लगता है कि यह है। जैसा कि ज़ीओ ने अपनी टिप्पणी में बताया कि क्लैंग यह सही हो जाता है। –

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