clang,std::function 和 -fno-rtti

clang, std::function and -fno-rtti

我正在通过 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.13.26128\include\functional(435,11):  error:
      cannot use typeid with -fno-rtti
                return (typeid(_Callable));
                        ^

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

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

这是一个错误 fixed in Clang 13


Clang MSVC 驱动程序无法将 _HAS_STATIC_RTTI 定义为 0,MSVC 标准库使用它来启用无 RTTI 代码。

作为解决方法,您可以使用编译器标志手动全局定义它,或者在包含任何标准库头文件之前定义它。