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 *也按值返回,因此我不确定为什么这样做(或者如果这是编译器错误),所以我应该只修改临时副本(如果有)。
答案 0 :(得分:2)
就布局而言,我们可以推测您的对象p
的布局与类型int*
的对象相同。
这是因为p
的类型是其唯一数据成员为unique_ptr<int>
的结构,而实际上又是唯一数据为int*
的结构。 (它也可能有一个包含删除程序的空基类。)
所有这些都是猜测,因为语言规则没有指定这些内容,但这是一个很好的猜测,因为它是人们可以想象的高效表示形式。
只是因为它的布局与int指针相同,所以当然不会 make 将您的对象变成int指针,但是如果您假装它是一个并覆盖它(则不允许这样做)进行操作),然后上面的内容说明了您看到的内容。
答案 1 :(得分:1)
(int*&)p
在那停!
这是未定义的行为警察,您在这里所做的一切根本不合法。您不能只转换结构并假装其int*&
并在它显然不是UB的经典示例时对其进行写入。
get()
与此无关。