Пишем ученику через 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]

Другие вопросы по тегам