Я недавно видел ниже кода (упрощенная версия, данная ниже) в моей кодовой базе, и получил это сомнение:
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()) ?
}
Да, адрес ссылки взять невозможно. Вы всегда получаете адрес объекта ссылки.
.Первое предложение стандарта 8.3.2/4:
Ссылок на ссылки, никаких массивов ссылок, и никаких указателей на ссылки
(Мой акцент)
Это не значит, что вы не можете взять адрес переменной, объявленной как ссылка, это просто значит, что для указателя на ссылку нет отдельного типа.
.Да, это эквивалентно. При взятии адреса ссылки возвращается адрес исходной вещи. Так как из ссылки невозможно получить другой адрес, для указателя на ссылку нет отдельного типа.
.