【一人 C++20 Advent Calendar 2019】typeid が constexpr に対応【17日目】

一人 C++20 Advent Calendar 2019 17日目の記事になります。

typeid が constexpr に対応

昨日書いた dynamic_cast が constexpr に対応したのに合わせて type_idconstexpr に対応しました。

#include <typeinfo>
#include <iostream>

struct A {
    virtual void dummy() {}
};

struct B {
    virtual void dummy() {}
};

int
main(){
    constexpr A a1{};
    constexpr A a2{};
    constexpr B b{};

    // OK
    constexpr std::type_info const& typeA1 = typeid(a1);
    constexpr std::type_info const& typeA2 = typeid(A);
    constexpr std::type_info const& typeB = typeid(b);

    constexpr A* p = 0;
    // NG: std::bad_typeid が投げられる場合はコンパイルエラー
    constexpr std::type_info const& nurupo = typeid(*p);

    return 0;
}

ただし、 std::type_infoメンバ関数constexpr には対応してない(しない?)ぽいので次のようなコードはエラーになります。
(少なくとも wandbox の clang-head gcc-head でエラーだった)

// エラー
static_assert(typeid(a1) == typeid(A));
static_assert(typeid(a1).hash_code() == typeid(A).hash_code());

これって C++20 だとどうなるんですかね…?
メンバ関数constexpr でないと結局使えなさそうな気がするんですがさて。

参照