clang,std :: function和-fno-rtti

时间:2017-12-23 07:32:40

标签: c++ c++11 clang clang-cl

我通过clang-cl在Windows上使用Clang 5,并且在使用-fno-rtti时尝试关闭运行时类型信息(std::function)时遇到问题。

这是我不能编译的例子:

#include <functional>

void foo(std::function<void()> ra2)
{
}

int main()
{
    auto bar = []()
    {
    };

    foo(bar);

    return EXIT_SUCCESS;
}

命令行:

clang-cl test.cpp -Xclang -fno-rtti

错误是:

C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.13.26128\include\functional(435,11):  error:
      cannot use typeid with -fno-rtti
                return (typeid(_Callable));
                        ^

令我感到惊讶的是,有没有办法在没有RTTI的情况下在Clang中使用std::function lambda?文档说只有target上的target_typestd::function才需要RTTI。我可以推出自己的std::function版本,但这样做似乎很遗憾。

如果我使用带有编译器标志/GR-的MSVC,它可以正常工作。

1 个答案:

答案 0 :(得分:4)

这是由于Clang MSVC驱动程序中的一个错误,它无法将_HAS_STATIC_RTTI定义为0,在某些情况下,MSVC标准库使用该错误来启用无RTTI兼容代码

作为一种解决方法,在修复错误之前,您可以使用编译器选项全局手动定义_HAS_STATIC_RTTI0,或在包含任何标准库标题之前定义它。