2010-01-08 2 views
5

Недавно я видел код ниже (упрощенная версия приводится ниже) в моей базе кода и получил это сомнение:Может ли указатель ссылаться на указатель и указатель на действительную переменную считаться одинаковым?

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. Указатель для ссылки и указатель на фактические переменный можно трактовать как же?
  2. Указывает ли стандарт что-либо по адресу ссылки для взаимозаменяемости, используемого для адреса переменной.

ответ

2

Да, адрес ссылки невозможен. Вы всегда получаете адрес упомянутого объекта.

2

Да, это эквивалентно. Принимая адрес ссылки, возвращает адрес оригинала. Поскольку нет способа получить какой-либо другой адрес из ссылки, нет отдельного типа для указателя на ссылку.

9

Первое предложение стандартного 8.3.2/4:

Там не должно быть никаких ссылок на ссылки, не массивы ссылок, и нет указатели на ссылки

(Мои упор)

Это не означает, что вы не можете взять адрес переменной, объявленной как ссылку, это просто означает, что нет отдельного type для указателя на ссылку.

+0

Я рад, что вы это разъяснили. ;-) –

+0

Хммм ... Я все еще путаюсь со строкой из стандарта. Я интерпретировал эту строку из стандарта как ---- мы не должны пытаться использовать указатели для ссылки. означает, адрес ссылки не должен использоваться. –

+0

@aJ Нет, это просто означает, что вы не можете объявлять типы типа 'B & *'. –

Смежные вопросы