Рассмотрим следующую программу на C ++:
#include <iostream>
template<typename T>
class A
{
public:
explicit A(T& x) : x_(x){}
const T& get() { return x_; }
private:
T x_;
};
int main()
{
int x = 42;
A<int&>(x).get() = 43; // compiles fine, even though get() looks like it returns a const ref
std::cout << x << '\n';
}
Программа компилирует OK и выводит 43. Это говорит о том, что на первый взгляд константная ссылка, возвращаемая get (), на самом деле является неконстантной reference, поскольку он позволяет изменять значение, на которое он ссылается.
Это правило свертывания ссылок вызывает такое поведение?
Как обеспечить, чтобы ссылка, возвращаемая из get (), действовалакак ссылка на const, то есть она не позволяет изменять значение, на которое она ссылается?