【发布时间】:2018-06-05 15:35:27
【问题描述】:
我在 Windows 上通过 clang-cl 使用 Clang 5,在使用 std::function 时尝试关闭运行时类型信息 (-fno-rtti) 时遇到问题。
这是我无法编译的示例:
#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 与 lambdas 一起使用?文档说只有std::function 上的target 和target_type 应该需要RTTI。我可以推出自己的std::function 版本,但不得不这样做似乎很可惜。
如果我使用带有编译器标志 /GR- 的 MSVC,它工作正常。
【问题讨论】:
-
这并不是因为 Clang 本身,而是因为使用了 MSVC 标准库,这显然需要
std::function的 RTTI。 MSVC 本身是否支持std::function关闭 RTTI?如果是,则可能是 MSVC Clang 兼容性驱动程序中的错误。 -
@tambre,是的,它在 msvc 中编译时没有 RTTI(编译器标志
/GR-) -
@keith 尝试在编译器选项中或在包含任何标准库头文件之前将
_HAS_STATIC_RTTI定义为0。如果它有效,那么我非常确定这是 MSVC 的 Clang 兼容性驱动程序中的一个错误。 -
@keith 他们是。但是您使用的是
EXIT_SUCCESS,它来自cstdlib。但是您实际上并没有包含cstdlib,这是保证定义EXIT_SUCCESS的唯一标头。由于给定标准库的实现细节,您的代码仍然可以编译。从标准的角度来看,使代码可移植的修复方法是简单地包含cstdlib。