Рассмотреть возможность:
class A
{
public:
const int& my_int_member() const { return my_int_member; }
const double& my_double_member const {return my_double_member; }
private:
int my_int_member;
double my_double_member;
};
class B
{
public:
const A& my_A_member() const { return my_A_member; }
private:
A my_A_member;
};
Современные компиляторы С++ (например, msvc, clang, gcc), установленные с максимальным уровнем оптимизации, каждый из которых обеспечивает, обычно распознают и оптимизируют повторные доступы к одному и тому же члену данных, как в:
B b;
do_stuff(b.my_A_member().my_double_member(), b.my_A_member().my_int_member());
double c = b.my_A_member().my_double_member() + b.my_A_member().my_int_member();
То есть понимают ли они, что могут повторно использовать одну и ту же ссылку, или они просто снова выполняют доступ?