cppmap / cppmap.docs

🗺️ Source code of "C++ の歩き方": C++20/23/26 resources written in Japanese.
https://cppmap.github.io/
The Unlicense
179 stars 20 forks source link

C++20 の新機能 : constexpr関係追加 #20

Closed onihusube closed 5 years ago

onihusube commented 5 years ago

constexpr関係のC++20新機能を書いてみました。

文章やコード内容はよしなになさってください!

Reputeless commented 5 years ago

ありがとうございます。確認中です。

https://github.com/cppmap/cppmap.docs/pull/20/commits/c33125843ac290c65dbeb693fcade3ee89a563ae#diff-d21ab1223d831e3533f251ff5bbb105aR322

{
  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 の標準会議で承認されるようなので、後日追記します。

onihusube commented 5 years ago

すいません、typeidに関して勘違いを見つけたので少し直します

onihusube commented 5 years ago

直しました

Reputeless commented 5 years ago

Merged. Thanks!