Почему я могу изменить unique_ptr по ссылке на .get ()? - PullRequest
0 голосов
/ 04 декабря 2018
struct
{
    std::unique_ptr<int> p;
    operator int*() { return p.get(); }
} p;
(int*&)p = (int*)0x5000;
std::cout << p.p.get();

Компилирует и распечатывает 0x5000 на MSVC и g ++.Я не уверен, почему это работает (или если это ошибка компилятора), учитывая, что unique_ptr :: get возвращает по значению, а мой оператор int * также возвращает по значению, поэтому я должен просто изменить временные копии, если что-нибудь.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Что касается компоновки, мы можем предположить, что ваш объект p расположен так же, как объект типа int*.

Это потому, что тип p является структурой, чейединственным элементом данных является unique_ptr<int>, а это, в свою очередь, фактически структура, единственным элементом данных которой является int*.(Вероятно, у него также есть пустой базовый класс, который содержит удалитель.)

Это все предположение, поскольку ничего из этого не указано в правилах языка, но это хорошее предположение, поскольку оно так же эффективно, как и представлениеможно представить.

То, что он расположен так же, как указатель int, конечно, не превращает ваш объект в указатель int, но если вы притворяетесь, что он один, и перезаписываете его (чтовам нельзя делать), тогда вышеизложенное объясняет, что вы видите.

0 голосов
/ 04 декабря 2018
(int*&)p

Стоп!

Это полиция неопределенного поведения, и то, что вы там делаете, не является законным.Вы не можете просто привести свою структуру и притвориться, что она int*& и написать в нее, хотя это явно не классический пример UB.

get() не имеет к этому никакого отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...