2012-05-16 1 views
6

Je me demande s'il y a un moyen de différencier les appels de fonction (avec des tableaux comme paramètres) indiqués dans le code suivant:Les tableaux et les rvalues ​​(comme paramètres)

#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 « famille de fonction » foo est capable de distinguer un objet temporaire d'un nom. Ce n'est pas le cas de foo_array.

Est-ce possible en C++ 11? Si non, pensez-vous que ce soit possible? (Évidemment changer la norme)

Cordialement. Fernando.

+0

Si vous avez utilisé VARIABLES 'std :: <>' au lieu de C-réseaux premières, ce serait trivial. – ildjarn

Répondre

14

Il n'y a rien de mal avec foo_array. C'est le cas de test qui est mauvais: "hello" est une lvalue! Penses-y. Ce n'est pas temporaire: les littéraux de chaîne ont une durée de stockage statique.

Un rvalue tableau serait quelque chose comme ceci:

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

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

Voici un exemple similaire (rétrogradé pour s'adapter au support C++ 11 de GCC 4.5) sur ideone: http://ideone.com/lgItR –

+2

Très bien. Un tableau temporaire peut-il se désintégrer en un pointeur? C'est à dire. Est-ce quelque chose qui a réellement une adresse? –

+0

@KerrekSB question intéressante que je crains de ne pas connaître la réponse à (et je n'ai pas le temps pour beaucoup de recherches en ce moment). Peut être utile de poster une nouvelle question à ce sujet. –

Questions connexes