Closed onihusube closed 5 years ago
ありがとうございます。確認中です。
{
constexpr int* nullp = nullptr;
constexpr auto&& t = typeid(nullp); //例外を投げるため定数実行できない
}
では例外を投げないので、
#include <typeinfo>
struct Cpp
{
virtual ~Cpp() = default;
};
int main()
{
constexpr Cpp* pCpp = nullptr;
constexpr auto& cpptype = typeid(*pCpp); // error: 例外 std::bad_typeid を投げるため constexpr 不可
}
に修正します。 ほか、サンプルコードをコンパイル可能で短いものに置き換える予定です。
struct Cpp
{
virtual int version() const = 0;
};
struct Cpp17 : Cpp
{
constexpr int version() const override
{
return 17;
}
};
struct Cpp20 : Cpp
{
constexpr int version() const override
{
return 20;
}
};
constexpr int GetVersion(const Cpp& a)
{
return a.version();
}
int main()
{
constexpr Cpp17 cpp17;
constexpr Cpp20 cpp20;
static_assert(GetVersion(cpp17) == 17);
static_assert(GetVersion(cpp20) == 20);
}
また、https://github.com/cppmap/cppmap.docs/pull/20/commits/c33125843ac290c65dbeb693fcade3ee89a563ae#diff-d21ab1223d831e3533f251ff5bbb105aR253
この変更に伴って std::type_info の operator== と operator!= がconstexpr指定され定数式で使用可能になります。
(P1328R0) は次回 2019-07 の標準会議で承認されるようなので、後日追記します。
すいません、typeid
に関して勘違いを見つけたので少し直します
直しました
Merged. Thanks!
constexpr関係のC++20新機能を書いてみました。
文章やコード内容はよしなになさってください!