2012-05-16 22 views
6

Zastanawiam się, czy jest jakiś sposób aby odróżnić wywołań funkcji (z tablicami jako parametry) przedstawione w poniższym kodzie:Tablice i Rvalues ​​(jako parametry)

#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 „funkcja rodzina” jest w stanie odróżnić obiekt tymczasowy od nazwanego. Nie jest tak w przypadku foo_array.

Czy to możliwe w C++ 11? Jeśli nie, czy myślisz, że to możliwe? (oczywiście zmieniając standard)

Pozdrawiam. Fernando.

+0

Jeśli użyto 'std :: array <>' zamiast surowych C-macierze, to byłoby trywialne. – ildjarn

Odpowiedz

14

Nie ma nic złego w foo_array. Jest to przypadek testowy, który jest zły: "hello" jest lwartością! Pomyśl o tym. Nie jest to tymczasowe: ciągi znaków mają stały czas przechowywania.

rvalue tablica będzie coś takiego:

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

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

Oto podobny przykład (obniżony, aby dopasować GCC 4.5 ograniczone wsparcie dla C++ 11) na ideone: http://ideone.com/lgItR –

+2

Bardzo ładne. Czy tymczasowa tablica może zanikać do wskaźnika? To znaczy. czy to jest coś, co ma adres? –

+0

@KerrekSB ciekawe pytanie, które obawiam się, nie znam odpowiedzi (i nie mam czasu na wiele badań w tej chwili). Może warto opublikować nowe pytanie na ten temat. –