2010-01-08 12 views
5

Hace poco vi el código de abajo (versión simplificada dada a continuación) en mi base de código y tiene esta duda:¿Se puede tratar el puntero a la referencia y el puntero a la variable real de la misma manera?

class B; 
class A 
{ 
    public: 
    A():m_A("testA"){} 
    B& getB() 
    { 
     return m_B; 
    } 
    B* getBPtr() //== > written to explain the problem clearly 
    { 
     return &m_B; 
    } 
private: 
    B m_B; 
}; 

class B 
{ 
    public: 
    B(const std::string& name):m_Name(name){} 
    std::string getName() const 
    { 
     return m_Name; 
    } 
private: 
    std::string m_Name; 
}; 

class C 
{ 
public: 
    void testFunc(B* ptr) 
    { 
    } 
}; 


int main() 
{ 
    A a; 
    C c; 
c.testFunc(&a.getB()); ===> is it equivalent to c.testFunc(a.getBPtr()) ? 
} 
  1. El puntero para referenciar y el puntero a la variable real puede ser tratado como iguales?
  2. ¿El estándar dice algo en la dirección de referencia para ser intercambiable utilizado para la dirección de la variable.

Respuesta

2

Sí, no es posible tomar la dirección de una referencia. Siempre obtienes la dirección del objeto referido.

2

Sí, es equivalente. Tomando la dirección de una referencia devuelve la dirección de la cosa original. Dado que no hay forma de obtener ninguna otra dirección de una referencia, no hay un tipo separado para un puntero a una referencia.

9

primera frase de la norma 8.3.2/4:

No habrá referencias a referencias, no hay matrices de referencias, y no hay punteros a referencias

(Mi énfasis)

Esto no significa que no puede tomar la dirección de una variable declarada como referencia, simplemente significa que no hay una separación escriba para un puntero a una referencia.

+0

Me alegra que haya aclarado eso. ;-) –

+0

Hmmm ... Todavía estoy confundido con la línea del estándar. Estaba interpretando esa línea del estándar como ---- no deberíamos tratar de tomar los punteros como referencia. significa que la dirección de la referencia no debe ser utilizada. –

+0

@aJ No, solo significa que no puede declarar tipos de tipo 'B & *'. –

Cuestiones relacionadas