2012-05-16 25 views
6

मुझे आश्चर्य है कि किसी भी तरह से निम्नलिखित कोड में दिखाया गया है (पैरामीटर के रूप में सरणियों के साथ) फ़ंक्शन कॉल अंतर करने के लिए वहाँ है यदि:Arrays और (पैरामीटर के रूप में) Rvalues ​​

#include <cstring> 
#include <iostream> 

template <size_t Size> 
void foo_array(const char (&data)[Size]) 
{ 
    std::cout << "named\n"; 
} 

template <size_t Size> 
void foo_array(char (&&data)[Size]) //rvalue of arrays? 
{ 
    std::cout << "temporary\n"; 
} 


struct A {}; 

void foo(const A& a) 
{ 
    std::cout << "named\n"; 
} 

void foo(A&& a) 
{ 
    std::cout << "temporary\n"; 
} 


int main(/* int argc, char* argv[] */) 
{ 
    A a; 
    const A a2; 

    foo(a); 
    foo(A());    //Temporary -> OK! 
    foo(a2); 

    //------------------------------------------------------------ 

    char arr[] = "hello"; 
    const char arr2[] = "hello"; 

    foo_array(arr); 
    foo_array("hello");  //How I can differentiate this? 
    foo_array(arr2); 

    return 0; 
} 

foo "समारोह परिवार" करने में सक्षम है नाम से एक अस्थायी वस्तु को अलग करें। Foo_array का मामला नहीं है।

क्या यह सी ++ 11 में संभव है? यदि नहीं, तो क्या आपको लगता है कि संभव हो सकता है? (स्पष्ट रूप से मानक बदल रहा है)

सम्मान। फर्नांडो।

+0

आप 'std :: सरणी <> का उपयोग किया है' कच्चे सी-सरणियों के बजाय, इस तुच्छ होगा:

एक सरणी rvalue कुछ इस तरह होगा। http://ideone.com/lgItR – ildjarn

उत्तर

14

foo_array के साथ कुछ भी गलत नहीं है। यह परीक्षण केस है जो खराब है: "hello" एक लाभा है! इसके बारे में सोचो। यह एक अस्थायी नहीं है: स्ट्रिंग अक्षर में स्थिर भंडारण अवधि होती है।

template <typename T> 
using alias = T; 
// you need this thing because char[23]{} is not valid... 

foo_array(alias<char[23]> {}); 
+1

यहाँ एक समान उदाहरण ideone पर (जीसीसी 4.5 सीमित सी ++ 11 समर्थन फिट करने के लिए डाउनग्रेड) है। एक पॉइंटर के लिए एक अस्थायी सरणी क्षय हो सकता है? अर्थात। क्या यह वास्तव में एक पता है? –

+2

बहुत अच्छा: –

+0

@KerrekSB दिलचस्प सवाल है कि मुझे डर है कि मुझे जवाब नहीं पता (और मेरे पास अभी बहुत अधिक शोध के लिए समय नहीं है)। इसके बारे में एक नया सवाल पोस्ट करने लायक हो सकता है। –

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