为什么拿参考地址给我一个二级指针?

时间:2018-03-11 06:09:36

标签: c++

我正在尝试实施更危险的reinterpret_cast。代码打击似乎不起作用。

#include<iostream>
#include<memory>

using namespace std;

template<typename TTo, typename TFrom>
TTo& horrible_cast(TFrom& from) {
    static_assert(sizeof(TFrom) == sizeof(TTo), "");
    union {
        TFrom* from = &from;  // error cannot convert
                              // from 'std::unique_ptr<int,std::default_delete<_Ty>> **' 
                              // to 'std::unique_ptr<int,std::default_delete<_Ty>> *' 
        TTo* to;
    };

    return *to;
    // return *reinterpret_cast<TTo*>(&from); this one works fine.
}


int main() {
    unique_ptr<int> u{ new int(3) };
    auto x = horrible_cast<int*>(u);
}

TFrom&推断为unique_ptr<int>&。但是当拿到它的地址时,它会给出一个unique_ptr<int>**。我该如何解决呢? 我在8.1窗口使用Visual Studio 2017社区

1 个答案:

答案 0 :(得分:1)

由于匿名联合,您收到了该错误。由于联合的成员被注入到周围的范围中,因此您有一个TFrom* from变量,它会隐藏参考参数TFrom& from

所以你要在初始化器中获取指针的地址。因此整个双指针shenanigans。

除此之外,reinterpret_cast已经足够危险了,所以我觉得你做这个更糟糕演员的工作是多余的。