2012-07-01 11 views
9

Sto cercando di capire perché not_a_ref non è un riferimento. Capisco che posso fare riferimento a auto &. Ho scavato nello standard per un po ', ma mi sono perso e non riuscivo a capire dove questo comportamento è definito.Perché l'auto non è un riferimento quando il suo inizializzatore è un riferimento?

Esempio:

#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

Sarebbe abbastanza fastidioso se funzionasse come pensavate. Renderebbe meno utile il 'auto', perché aggiungere un riferimento è facile, ma rimuoverne uno è un dolore. –

+0

Non sto affatto suggerendo che dovrebbe essere diverso da quello che è, solo cercando di capire come questo comportamento è specificato nello standard. Fa parte del mio personale obiettivo di essere in grado di capire questo genere di cose semplicemente leggendo lo standard - ma mi sono bloccato. – Zac

+0

[Ecco il documento.] (Http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf) Non ho voglia di guardare nello standard, quindi ho solo su Google. La prima pagina ha un esempio di una funzione che restituisce un riferimento a un oggetto float e il tipo viene dedotto in float. –

risposta

5

Da C++ 11 progetto, 7.1.6.4 (auto specifier) ​​il paragrafo 6:

Il tipo dedotto per la variabile d è quindi la deduzione A determinata utilizzando le regole di deduzione argomento argomento da una funzione cal l (14.8.2.1).

E da 14.8.2.1 (dedurre argomenti modello da una chiamata di funzione) il paragrafo 3:

Se P è un tipo di riferimento, il tipo a cui si riferisce P viene utilizzato per il tipo di detrazione.

Quindi il riferimento viene semplicemente ignorato per la deduzione del tipo di auto.

Nota come questa regola è diversa da quella di decltype.

UPDATE: Si prega di vedere il mio commento qui sotto, come penso che 14.8.2.1 comma 3 non si applica.

+0

Ora, devo correggermi ... In 14.8.2.1, 'P' è il tipo del tipo di parametro template (cioè' auto') mentre 'A' è il tipo dell'espressione usata per la deduzione. Tuttavia, il tipo di un'espressione non è mai un riferimento, quindi il fatto principale rimane che una variabile 'auto x' non sarà mai un riferimento. – rodrigo

3

Dai un'occhiata alla detrazione modello di argomentazione. auto x = stuff; equivale a template<typename T> void f(T x) {} f(stuff); fino al tipo di x.

-1

In base allo standard C++ 11, l'auto conta come uno specificatore di tipo semplice [7.1.6.2], pertanto le stesse regole si applicano ad esso come ad altri specificatori di tipo semplice. Ciò significa che dichiarare riferimenti con auto non è diverso da qualsiasi altra cosa.

Ciò significa riga successiva:

auto not_a_ref = get_stuff(); 

sta per essere lo stesso:

std::vector<int> not_a_ref = get_stuff(); 
Problemi correlati