2012-05-16 14 views
6

mi domando se c'è qualche modo per differenziare le chiamate di funzione (con array come parametri) mostrato nel codice seguente:Array e rvalues ​​(come parametri)

#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; 
} 

La foo "funzione di famiglia" è in grado di distinguere un oggetto temporaneo da un nome. Non è il caso di foo_array.

È possibile in C++ 11? Se no, pensi che potrebbe essere possibile? (ovviamente cambiando lo standard)

Cordiali saluti. Fernando.

+0

Se è stato utilizzato 'std :: array <>' invece di C-array prime, questo sarebbe banale. – ildjarn

risposta

14

Non c'è niente di sbagliato con foo_array. È il caso di test che è male: "hello" è un lvalue! Pensaci. Non è temporaneo: i valori letterali delle stringhe hanno una durata di archiviazione statica.

Un rvalue serie sarebbe qualcosa di simile a questo:

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

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

Ecco un esempio simile (downgrade per adattarsi al supporto C++ 11 limitato a GCC 4.5) su ideone: http://ideone.com/lgItR –

+2

Molto bello. Un array temporaneo può decadere da un puntatore? Cioè è qualcosa che in realtà ha un indirizzo? –

+0

@KerrekSB domanda interessante che temo di non conoscere la risposta (e non ho tempo per molte ricerche in questo momento). Può valere la pena postare una nuova domanda a riguardo. –

Problemi correlati