clang, std::function и -fno-rtti

Я использую 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-,

1 ответ

Решение

Это связано с ошибкой в ​​драйвере Clang MSVC, когда он не может определить _HAS_STATIC_RTTI в 0, который используется стандартной библиотекой MSVC для включения в некоторых случаях кода, не совместимого с RTTI.

В качестве обходного пути, пока ошибка не будет устранена, вы можете вручную определить _HAS_STATIC_RTTI в 0 глобально используя параметры компилятора или определяя его перед включением любых стандартных заголовков библиотеки.

Другие вопросы по тегам