为什么我可以通过引用.get()来修改unique_ptr?

时间:2018-12-03 21:56:02

标签: c++ reference

struct
{
    std::unique_ptr<int> p;
    operator int*() { return p.get(); }
} p;
(int*&)p = (int*)0x5000;
std::cout << p.p.get();

在MSVC和g ++上编译并打印出0x5000。考虑到unique_ptr :: get按值返回,而我的运算符int *也按值返回,因此我不确定为什么这样做(或者如果这是编译器错误),所以我应该只修改临时副本(如果有)。

2 个答案:

答案 0 :(得分:2)

就布局而言,我们可以推测您的对象p的布局与类型int*的对象相同。

这是因为p的类型是其唯一数据成员为unique_ptr<int>的结构,而实际上又是唯一数据为int*的结构。 (它也可能有一个包含删除程序的空基类。)

所有这些都是猜测,因为语言规则没有指定这些内容,但这是一个很好的猜测,因为它是人们可以想象的高效表示形式。

只是因为它的布局与int指针相同,所以当然不会 make 将您的对象变成int指针,但是如果您假装它是一个并覆盖它(则不允许这样做)进行操作),然后上面的内容说明了您看到的内容。

答案 1 :(得分:1)

(int*&)p

在那停!

这是未定义的行为警察,您在这里所做的一切根本不合法。您不能只转换结构并假装其int*&并在它显然不是UB的经典示例时对其进行写入。

get()与此无关。