我通过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_type
和std::function
才需要RTTI。我可以推出自己的std::function
版本,但这样做似乎很遗憾。
如果我使用带有编译器标志/GR-
的MSVC,它可以正常工作。
答案 0 :(得分:4)
这是由于Clang MSVC驱动程序中的一个错误,它无法将_HAS_STATIC_RTTI
定义为0
,在某些情况下,MSVC标准库使用该错误来启用无RTTI兼容代码
作为一种解决方法,在修复错误之前,您可以使用编译器选项全局手动定义_HAS_STATIC_RTTI
到0
,或在包含任何标准库标题之前定义它。