【一人 C++20 Advent Calendar 2019】dynamic_cast が constexpr に対応【16日目】
一人 C++20 Advent Calendar 2019 16日目の記事になります。
dynamic_cast が constexpr に対応
dynamic_cast
が constexpr
に対応しました。
#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; }
これはコンパイル時にいろいろと型精査できそうな予感がしますね!!!