RTTI для виртуального наследования (без виртуальных функций)

Я заметил, что и Clang, и GCC генерируют информацию о типах для неполиморфных типов с виртуальным наследованием. Как я понял, по стандарту этого не требуется. Почему они это делают, и как это используется?

Пример:

#include <iostream>
#include <string>
#include <typeinfo>

struct VirtualBase {};
struct Derived : virtual VirtualBase{};

int main()
{
    Derived md;
    uintptr_t **vptr = (uintptr_t **)&md;
    std::type_info * tinfo = (std::type_info *)(*vptr)[-1];
    std::cout << tinfo->name() << "\n";
    return 0;
}

Выход: 7Derived

После прочтения документации ABI я ожидал получить segfault вместо ответа:

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-components

Указатель typeinfo является допустимым указателем для полиморфных классов, т. е. для классов с виртуальными функциями, и равен нулю для неполиморфных классов.


person random    schedule 25.09.2018    source источник
comment
Также см. Как настроить RTTI в стиле LLVM для иерархии классов.   -  person jww    schedule 26.09.2018
comment
@jww это не имеет прямого отношения к llvm.   -  person random    schedule 26.09.2018
comment
gcc, icc и Clang будут использовать виртуальные таблицы для обеспечения RTTI, необходимого для работы dynamic_cast при наличии виртуальных баз. Виртуальные таблицы С++ также необходимы для других неполиморфных концепций. stackoverflow.com/questions/20174373/   -  person RajeshDA    schedule 26.09.2018
comment
@ user1512 Нет, динамическое приведение не разрешено для неполиморфных классов. У меня возникла ошибка компиляции, если я попытаюсь сделать это для классов с виртуальным наследованием (но без виртуальных функций).   -  person random    schedule 27.09.2018