2012-07-01 14 views
9

Estoy tratando de entender por qué not_a_ref no es una referencia. Entiendo que puedo hacer una referencia por auto &. Busqué en el estándar por un tiempo, pero me perdí y no pude entender dónde se define este comportamiento.¿Por qué Auto no es una referencia cuando su inicializador es una referencia?

Ejemplo:

#include <vector> 
#include <iostream> 
#include <type_traits> 

std::vector<int> stuff; 

std::vector<int>& get_stuff() 
{ 
    return stuff; 
} 

int main() 
{ 
    auto not_a_ref = get_stuff(); 

    if(std::is_reference<decltype(not_a_ref)>::value) 
     std::cout << "is_reference true" << std::endl; 
    else 
     std::cout << "is_reference false" << std::endl; 

    if(&not_a_ref != &stuff) 
     std::cout << "definately not a reference" << std::endl; 

    return 0; 
} 
+4

Sería bastante molesto si funcionara de la manera que creías. Sería 'auto 'mucho menos útil, porque agregar una referencia es fácil, pero eliminar uno es un problema. –

+0

No estoy sugiriendo de ninguna otra manera que sea de otra manera, solo trato de entender cómo se especifica este comportamiento en el estándar. Es parte de mi objetivo personal de poder resolver este tipo de cosas simplemente leyendo el estándar, pero me quedé atascado. – Zac

+0

[Aquí está el documento.] (Http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf) No tengo ganas de buscar en el estándar, así que solo googleó eso. La primera página tiene un ejemplo de una función que devuelve una referencia a un flotante, y el tipo se deduce para flotar. –

Respuesta

5

De C++ 11 proyecto, 7.1.6.4 (auto especificador) del párrafo 6:

El tipo deducido para la variable d es el deducido A determinado usando las reglas de la deducción del argumento de la plantilla de una función cal l (14.8.2.1).

Y a partir de 14.8.2.1 (deducir argumentos de plantilla de una llamada de función) del párrafo 3:

Si P es un tipo de referencia, del tipo mencionado por P se utiliza para el tipo de deducción.

Por lo tanto, la referencia solo se ignora para la deducción de tipo de auto.

Observe cómo esta regla es diferente de la de decltype.

ACTUALIZACIÓN: Por favor, consulte mi comentario a continuación, ya que creo que 14.8.2.1 párrafo 3 no se aplica.

+0

Ahora, tengo que corregirme a mí mismo ... En 14.8.2.1, 'P' es el tipo del tipo de parámetro de la plantilla (que es' auto') mientras que 'A' es el tipo de expresión utilizada para la deducción. Sin embargo, el tipo de expresión nunca es una referencia, por lo que el hecho principal es que una variable 'auto x' nunca será una referencia. – rodrigo

3

Tener un vistazo a la deducción argumento de plantilla. auto x = stuff; es bastante equivalente a template<typename T> void f(T x) {} f(stuff); en cuanto el tipo de x.

-1

De acuerdo con el estándar C++ 11, cuenta automáticamente como un especificador de tipo simple [7.1.6.2], por lo tanto, se aplican las mismas reglas que a otros especificadores de tipo simple. Esto significa que declarar referencias con auto no es diferente de cualquier otra cosa.

Esto significa línea siguiente:

auto not_a_ref = get_stuff(); 

va a ser el mismo que:

std::vector<int> not_a_ref = get_stuff(); 
Cuestiones relacionadas