c++ - llvm clang 编译器上的 dynamic_cast 失败

标签 c++ compilation llvm clang dynamic-cast

我看到一个奇怪的失败,其中 dynamic_cast 在 clang 编译器上返回 NULL。但是相同的代码适用于 gcc 环境。

您能指出根本原因是什么吗? llvm 和 gcc 上的 dynamic_cast 之间可能有什么区别。

我正在使用两个编译器的默认行为,我认为默认情况下 RTTI 是启用的。

template<typename T> T* 
find_msg_of_type(
    MsgList *list
) {
    T* msg = NULL;

    if (list) {
        for (std::vector<MsgList*>::iterator it = list->element.begin();
                                                        it != list->element.end();
                                                        it++) {// MsgList can be list of objects build with GSoap.
            if (typeid(*(*it)) == typeid(T)) {
                msg = dynamic_cast<T*>(*it); // Failing on clang but this same code is working with gcc compiler.
                break;
            }
        }
    }

    return msg;
}

再观察一下:使用 gcc

if (typeid(*(*it)) == typeid(T))

按预期完美工作,但有 clang

if (typeid(*(*it)) == typeid(T))

比较显示出不同的行为。不确定为什么会有所不同。

谢谢

最佳答案

对于这样的代码,一个好主意是静态地确保类 T 派生自 MsgList。使用 boost,可以这样完成:

BOOST_STATIC_ASSERT((boost::is_base_and_derived::value));

关于c++ - llvm clang 编译器上的 dynamic_cast 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14119136/

相关文章:

c++ - 对象和基元通过引用传递之间的区别

python - OpenCV - Python 绑定(bind)中的 IPP、TBB 和 CUDA

java - 编译时的方法选择。如果参数可以有多种类型怎么办?

clang - 如何查看 Clang AST?

javascript - 如何在浏览器中将 C++ 编译为 JavaScript?

c++ - 除非在 target_link_directories() 命令上调用 pthread,否则 CMake 构建失败

c++ - linux浮点_control87替换

c++ - 原始 pcm 音频文件到 Windows Qt 项目中的 ogg

java - 从Java源代码的编译消息中仅重定向错误消息

LLVM IRBuilder : set insert point after a particular instruction