Вот моя ситуация:
- У меня есть класс с переменной-членом ссылки const.
- Я пытаюсь инициализировать эту переменную-член из константной ссылки.
Моя проблема заключается в том, что когда переменная-член инициализируется в классе, создается временная копия рассматриваемого объекта, и для ссылки используется временный адрес. Когда переменная-член инициализируется в списке инициализаторов конструктора, копия не создается. В любом случае программа отлично компилируется без предупреждений в g++ 4.8.3 с флагами c++11 или c++1y.
Ниже приведена минимальная программа и вывод. Я просто хотел бы лучше понять правила этого, чтобы знать, почему это происходит (или если это ошибка).
#include <iostream>
using namespace std;
struct A
{
A( )
{
cout << "creating an A at " << this << endl;
}
A( const A & a )
{
cout << "copying an A from instance at " << & a << " to instance at " << this << endl;
}
};
A g_aardvark;
const A & GetAardvark( )
{
cout << "returning an A at " << & g_aardvark << endl;
return g_aardvark;
}
struct B
{
B( )
: m_a1( GetAardvark( ) )
, m_a2( g_aardvark )
{ }
const A & m_a1;
const A & m_a2;
const A & m_a3{ GetAardvark( ) };
const A & m_a4{ g_aardvark };
};
int main( )
{
B butter;
cout << "B has m_a1 at " << & butter.m_a1 << endl;
cout << "B has m_a2 at " << & butter.m_a2 << endl;
cout << "B has m_a3 at " << & butter.m_a3 << endl;
cout << "B has m_a4 at " << & butter.m_a4 << endl;
return 0;
}
Пример вывода:
creating an A at 0x601494
returning an A at 0x601494
returning an A at 0x601494
copying an A from instance at 0x601494 to instance at 0x7fffc595f87f
copying an A from instance at 0x601494 to instance at 0x7fffc595f87e
B has m_a1 at 0x601494
B has m_a2 at 0x601494
B has m_a3 at 0x7fffc595f87f
B has m_a4 at 0x7fffc595f87e
int main() { A a; A const &b { a } ; }
- person M.M   schedule 08.09.2016