2012-05-16 8 views
6

me pregunto si hay alguna manera de diferenciar las llamadas de función (con matrices como parámetros) que se muestran en el siguiente código:matrices y rvalues ​​(como parámetros)

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

El foo "familia función" es capaz de distinguir un objeto temporal de un nombre. No es el caso de foo_array.

¿Es posible en C++ 11? Si no, ¿crees que podría ser posible? (obviamente cambiando el estándar)

Atentamente. Fernando.

+0

Si utilizó 'std :: array <>' en lugar de primas C-arrays, esto sería trivial. – ildjarn

Respuesta

14

No hay nada de malo en foo_array. Es el caso de prueba que es malo: "hello" es un lvalue! Piénsalo. No es temporal: los literales de cadena tienen una duración de almacenamiento estática.

Un rvalue array sería algo como esto:

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

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

Aquí hay un ejemplo similar (degradado para adaptarse a la compatibilidad con C++ 11 limitada de GCC 4.5) en ideone: http://ideone.com/lgItR –

+2

Muy agradable. ¿Puede una matriz temporal decaer a un puntero? Es decir. ¿es algo que realmente tiene una dirección? –

+0

@KerrekSB pregunta interesante que me temo que no sé la respuesta (y no tengo tiempo para mucha investigación en este momento). Puede valer la pena publicar una nueva pregunta al respecto. –

Cuestiones relacionadas