2012-01-10 27 views
21

supongamos que tenemos un objeto con la siguiente interfaz:auto de const std :: vector <> &; objeto o referencia?

struct Node_t { 
... const std::vector<something>& getChilds() const; 
} node; 

Ahora, tengo acceso a la propiedad con una variable auto así:

auto childs = node->getChilds(); 

¿cuál es el tipo de childs? a std::vector<something> o una referencia a uno?

+0

'std :: vector < something >' – lapk

+0

¿No sería 'const std :: vector ' – Dovahkiin

Respuesta

24

El tipo de childs será std::vector<something>.

auto funciona con las mismas reglas que template type deduction. El tipo elegido aquí es el mismo que se elegiría para template <typename T> f(T t); en una llamada como f(node->getChilds()).

Del mismo modo, auto& le conseguiría el mismo tipo que ser recogido por template <typename T> f(T& t); y auto&& le conseguiría el mismo tipo que ser recogido por template <typename T> f(T&& t);.

Lo mismo aplica para todas las demás combinaciones, como auto const& o auto*.

+0

lo que es auto &&? Consultará la referencia? ¿Qué significa? –

+2

'&&' denota una referencia rvalue. Es una característica C++ 11, al igual que 'auto' es.' auto && 'puede convertirse en una referencia lvalue (es decir, una referencia" normal "como' & ') o un valor r referencia. –

+2

Aquí hay una pregunta que lo explica: http://stackoverflow.com/questions/5481539/what-does-t-mean-in-c0x –

21

Es un std::vector<something>. Si desea una referencia, puede hacer esto:

auto & childs = node->getChilds(); 

Por supuesto, será una referencia directa.

+10

C++ hace tan fácil para invocar accidentalmente un constructor de copia :( –

3

auto le da std::vector<something>. Puede especificar calificador de referencia auto & o, alternativamente, puede utilizar decltype:

decltype(node->getChilds()) childs = node->getChilds(); 
Cuestiones relacionadas