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

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

dynamic_cast が constexpr に対応

dynamic_castconstexpr に対応しました。

#include <iostream>

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

struct B : A {
    constexpr B(int value) : value(value) {}
    virtual int get() { return value; }
    int value;
};

struct C {};

int
main(){
    static constexpr B derived{ 42 };
    constexpr A const* base = &derived;

    // OK
    constexpr B const* derived2 = dynamic_cast<B const*>(base);
    constexpr B const& derived3 = dynamic_cast<B const&>(*base);

    static_assert(derived2->value == 42);
    static_assert(derived3.value == 42);

    // OK: nullptr が返ってくる
    constexpr C const* derived4 = dynamic_cast<C const*>(base);
    static_assert(derived4 == nullptr);

    // NG: std::bad_cast が投げられるのでコンパイルエラー
    constexpr C const& derived5 = dynamic_cast<C const&>(*base);

    return 0;
}

これはコンパイル時にいろいろと型精査できそうな予感がしますね!!!

参照