Пишем ученику через const &
В этом примере, приведение в стиле c к int&
с последующим присвоением вида взломать интерфейс класса A
неопределенное поведение?
class A
{
public:
A()
: x(0)
{
}
~A()
{
std::cout << x << std::endl;
}
const int& getX()
{
return x;
}
private:
int x;
};
int main()
{
A a;
int& x = (int&)a.getX();
x = 17;
std::cout << x << std::endl;
}
Выход:
17
17
Если да, на какую часть стандарта я могу ссылаться? Кроме того, есть ли причина, почему это компилируется без предупреждений? (я тестировал с C++14 на cpp.sh с -Wall, -Wextra и -Wpedantic)
1 ответ
const int& getX() { return x; }
Поскольку этот метод не помечен как const, x является изменяемым int. Ссылка берется и приводится к const int& в точке возврата. Обратите внимание, что хотя ссылка на const int, реальный рефери int является изменяемым. Это важно.
int& x = (int&)a.getX();
Эта строка принимает возвращенную ссылку const int и const_cast
это ссылка на int. Это законно в C++, полная остановка. [expr.const.cast]
Однако запись через эту ссылку допустима только в том случае, если исходный объект, на который ссылаются, является изменяемым.
В этом случае это так.
Вы найдете подробности в [dcl.type.cv]