Я использую Clang 5 в Windows через clang-cl и столкнулся с проблемой, пытаясь отключить информацию о типе среды выполнения (-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));
^
Это удивляет меня, есть ли способ использовать std::function
с лямбдами в Clang без RTTI? Документы говорят, что только target
а также target_type
на std::function
должен быть нужен RTTI. Я могу свернуть свою собственную версию std::function
, но, кажется, стыдно это делать.
Это работает нормально, если я использую MSVC с флагом компилятора /GR-
,
Это связано с ошибкой в драйвере Clang MSVC, когда он не может определить _HAS_STATIC_RTTI
в 0
, который используется стандартной библиотекой MSVC для включения в некоторых случаях кода, не совместимого с RTTI.
В качестве обходного пути, пока ошибка не будет устранена, вы можете вручную определить _HAS_STATIC_RTTI
в 0
глобально используя параметры компилятора или определяя его перед включением любых стандартных заголовков библиотеки.
Других решений пока нет …