C++ BADOX强制异常抛出*此派生模板类

C++ BADOX强制异常抛出*此派生模板类,c++,templates,c++11,dynamic-cast,C++,Templates,C++11,Dynamic Cast,我正在尝试一个虚拟模板函数实现。当我将这个指针转换为指向子类模板的指针时,它可以工作,但当我将*这个转换为指向子类的引用时,它不能工作,为什么 template <typename T> struct BB; // forward reference (not bound until instantiation in main) struct AA { virtual ~AA(){} template <typename T> void opera

我正在尝试一个虚拟模板函数实现。当我将这个指针转换为指向子类模板的指针时,它可以工作,但当我将*这个转换为指向子类的引用时,它不能工作,为什么

template <typename T> struct BB; // forward reference (not bound until instantiation in main)
struct AA
{
    virtual ~AA(){}
    template <typename T>
    void operator()(T && t)
    {
        dynamic_cast<BB<T>*>(this)->operator()(std::forward<T>(t)); // works!
        dynamic_cast<BB<T>&>(*this)(std::forward<T>(t));            // compiles but throws bad_cast
    }
};
template <typename T>
struct BB : AA
{
    void operator()(T t) { std::cout << "BB::operator()" << std::endl; }
};

int main()
{
    BB<int> bb;
    int k = 5;
    static_cast<AA&>(bb)(k);
}

在您的呼叫中;,T被推断为int&,包含*的最派生对象不是BB类型。因此,两次强制转换都失败,指针间接寻址会产生未定义的行为。

工作是什么意思?请尝试静态\u castb5;:-@KerrekSB,调用void BB::operator&tSo young,如此天真,如此容易误导…@KerrekSB,修复了接收方法签名。值得一提的是,在这种情况下,未定义的行为似乎是正确的。当OP调用一个没有访问自己对象的函数时,该函数会打印预期的结果,即使指针的动态转换返回的结果是==nullptr。这很有趣。此修复是否按照OP的预期工作@DanielJour,当我们在做这件事的时候,也可以去掉你的cv。@ThomasMcLeod在这种情况下使用std::Decation。@DanielFrey:当你的自动驾驶轨道飞行器撞上孤儿院时,最好的未定义行为就是做正确的事情,给你带来百万美元的诉讼-