2012-02-13 9 views
8

Supongamos que tengo una clase de esa manera:Diferencia entre `T &` y `const T &` para todos const clase

class Foo : boost::noncopyable 
{ 
public: 
    Foo(int a, int b); 

    const int something; 
    const int something_else; 
    const std::string another_field; 
    // and that's that, no more methods nor fields 
}; 

Ahora, ¿hay alguna diferencia práctica entre el acceso a los objetos de esta clase a través de una Foo&, a diferencia de const Foo&, aparte de que estos dos son dos tipos distintos?

No debería haber ninguna diferencia para acceder a sus campos , ya que son const, por lo que se tendrá acceso a través de un const T& de todos modos.

¿Pero hay alguna diferencia de cuando se trata de la clase en general? Algo que ver con las plantillas, tal vez? ¿Cualquier cosa?


Ahora que templatetypedef has written a nice answer, que por desgracia no es útil en este caso, creo que sería bueno para subrayar que es muy mucho de qué se puede hacer cuando ya tiene una referencia (tenga en cuenta todos estos "accediendo"), no sobre lo que puede vincular a la referencia.

Por lo tanto, puede suponer que la referencia ya está allí, vinculada a algún objeto. Ahora todo se trata de lo que se puede hacer con eso.

+0

En una nota lateral, si tiene dos 'Foo's llamados' a' y 'b', la asignación' a = b' es ilegal. ¿Es eso lo que quieres? – fredoverflow

+1

@FredOverflow: Sí, incluso se hace explícito: 'clase Foo: boost :: noncopyable'. – Fanael

Respuesta

13

no estoy seguro si esto es lo que estás buscando, pero consideran que esta función:

void DoSomething(Foo& fooRef); 

En este caso, no puede llamada

DoSomething(Foo()); // Error- can't bind a reference to a temporary 

Sin embargo, si tenemos esta función:

void DoSomethingConst(const Foo& fooRef); 

Entonces, de hecho, podemos llamar

DoSomethingConst(Foo()); // Okay - const reference can bind to a temporary 

por lo que hay una diferencia ligeramente en que una referencia const potencialmente puede obligar a un temporal Foo cuando una referencia no const no puede. En consecuencia, probablemente desee que las funciones que toman Foo s tomen en const Foo& en lugar de Foo& para que sea posible llamar a la función con provisionales.

Espero que esto ayude!

+0

+1. Además, ¿no hay algunas optimizaciones que el compilador puede hacer para las cosas 'const'? –

+0

@SethCarnegie Pensé en eso, pero como todos los miembros son const, ¿no pueden las optimizaciones suceder de todos modos? +1 de mi parte también –

+0

Ah, aunque es tan obvio como correcto, se trata más de lo que se puede vincular a la referencia que de lo que se puede hacer al acceder a ella. Y dudo que alguna vez tenga que hacer un temporal de este tipo. Entonces, aunque aprecio tu respuesta, honestamente no puedo expresarlo. – Fanael

Cuestiones relacionadas