Constexprメンバー関数

平均

エンジンによってパラメーター化されstructテンプレートSあるとします

template<class Engine> struct S;

私は2つのエンジンを持っています:constexprメンバー関数を持つ「静的」エンジンsize()と非constexprメンバー関数を持つ「動的」エンジンsize()

struct Static_engine {
    static constexpr std::size_t size() {
        return 11;
    }
};

struct Dynamic_engine {
    std::size_t size() const {
        return size_;
    }
    std::size_t size_ = 22;
};

私が定義するsize()にはメンバ関数Sとして使用することができるconstexprエンジンのがあればsize()ですがconstexpr私は書きます:

template<class Engine>
struct S {
    constexpr std::size_t size() const {
        return engine_.size();
    }
    Engine engine_;
};

次に、次のコードがGCC、Clang、MSVC、およびICCでコンパイルされます。

S<Static_engine> sta;         // not constexpr
S<Dynamic_engine> dyn;

constexpr auto size_sta = sta.size();
const auto size_dyn = dyn.size();

の複雑さconstexprとさまざまな「不正な形式、診断は不要」を考慮に入れると、私はまだ疑問があります。このコードは整形式ですか?

Godbolt.orgの完全なコード

このコードの有効性がこれら2つの標準で異なる場合に備えて、この質問に両方のタグを付けました。)

StoryTeller-Unslander Monica

コードは書かれているとおりに問題ありません。

[dcl.constexpr]

6 constexpr関数テンプレートまたはクラステンプレートのメンバー関数のインスタンス化されたテンプレート特殊化がconstexpr関数またはconstexprコンストラクターの要件を満たさない場合、そのような特殊化は、そのような呼び出しがあったとしても、constexpr関数またはconstexprコンストラクターのままです。関数を定数式に含めることはできません。テンプレートの特殊化が、非テンプレート関数またはコンストラクターと見なされたときにconstexpr関数またはconstexprコンストラクターの要件を満たさない場合、テンプレートは形式が正しくなく、診断は必要ありません。

メンバーはDynamic_engineを使用する特殊化の定数式に表示されない場合がありますが、上記の段落で詳しく説明しているように、S::size不正な形式になりませんまた、有効なインスタンス化可能であるため、NDRの不正な領域からはほど遠いですStatic_engine代表的な例です。

引用は、最後のC ++ 17標準ドラフトであるn4659からのものであり、同様の表現が最新のC ++ 20ドラフトに表示されます。


sta.size()定数式としての評価については、[expr.const]のリストを調べても、評価自体で許可されていないものは見つかりません。したがって、これは有効な定数式です(リストに無効なものが示されているため)。以下のために、一般的にconstexpr機能が有効であるために、ただ存在することが必要であるいくつかの評価が有効な定数式を生成するために引数のセットを。次の例のフォームが示すように、標準は次のことを示しています。

constexpr int f(bool b)
  { return b ? throw 0 : 0; }           // OK
constexpr int f() { return f(true); }   // ill-formed, no diagnostic required

struct B {
  constexpr B(int x) : i(0) { }         // x is unused
  int i;
};

int global;

struct D : B {
  constexpr D() : B(global) { }         // ill-formed, no diagnostic required
                                        // lvalue-to-rvalue conversion on non-constant global
};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Constexpr静的メンバー関数の使用法

分類Dev

これを使用しないconstexprメンバー関数?

分類Dev

クラステンプレートのConstexprメンバー関数

分類Dev

constexpr静的メンバーと変数

分類Dev

C ++のstd :: vectorデータメンバーを含むconstexprメンバー関数

分類Dev

非constメンバー関数でのconstexprの使用は何ですか?

分類Dev

非constメンバー関数でのconstexprの使用は何ですか?

分類Dev

クラス内で自動を返す静的constexprメンバー関数の使用

分類Dev

参照を介した `constexpr`メンバー関数の呼び出し-clangvs gcc

分類Dev

constexprメンバー関数で非constメンバーを使用できるのはいつですか?

分類Dev

Constメンバー関数

分類Dev

静的constexprメンバー変数を関数に渡せないのはなぜですか?

分類Dev

constexprコンストラクターを使用したconstexpr非静的メンバー関数(gcc、clangは異なります)

分類Dev

C ++ 17:.cppファイルで静的constexprメンバー関数を定義する

分類Dev

戻りステートメントのC ++ constexpr関数

分類Dev

メンバー関数の静的変数

分類Dev

メンバー関数の静的変数

分類Dev

constexpr静的メンバー変数を使用した奇妙な動作

分類Dev

静的constexprメンバー変数を理解する

分類Dev

constexprオブジェクトの関数ポインタメンバー関数を使用したstd :: arrayの初期化

分類Dev

条件付きのconstexprクラスメンバー関数内でコンパイルする非constexprバリアントメンバー呼び出し-なぜですか?

分類Dev

constexprパラメーター化された関数ポインター

分類Dev

メンバー関数を指す関数ポインター

分類Dev

メンバー関数の特性

分類Dev

メンバー関数のdecltype

分類Dev

Constメンバー関数とtypedef、C ++

分類Dev

クラスメンバー関数

分類Dev

* thisおよびconstメンバー関数

分類Dev

メンバー関数への参照

Related 関連記事

  1. 1

    Constexpr静的メンバー関数の使用法

  2. 2

    これを使用しないconstexprメンバー関数?

  3. 3

    クラステンプレートのConstexprメンバー関数

  4. 4

    constexpr静的メンバーと変数

  5. 5

    C ++のstd :: vectorデータメンバーを含むconstexprメンバー関数

  6. 6

    非constメンバー関数でのconstexprの使用は何ですか?

  7. 7

    非constメンバー関数でのconstexprの使用は何ですか?

  8. 8

    クラス内で自動を返す静的constexprメンバー関数の使用

  9. 9

    参照を介した `constexpr`メンバー関数の呼び出し-clangvs gcc

  10. 10

    constexprメンバー関数で非constメンバーを使用できるのはいつですか?

  11. 11

    Constメンバー関数

  12. 12

    静的constexprメンバー変数を関数に渡せないのはなぜですか?

  13. 13

    constexprコンストラクターを使用したconstexpr非静的メンバー関数(gcc、clangは異なります)

  14. 14

    C ++ 17:.cppファイルで静的constexprメンバー関数を定義する

  15. 15

    戻りステートメントのC ++ constexpr関数

  16. 16

    メンバー関数の静的変数

  17. 17

    メンバー関数の静的変数

  18. 18

    constexpr静的メンバー変数を使用した奇妙な動作

  19. 19

    静的constexprメンバー変数を理解する

  20. 20

    constexprオブジェクトの関数ポインタメンバー関数を使用したstd :: arrayの初期化

  21. 21

    条件付きのconstexprクラスメンバー関数内でコンパイルする非constexprバリアントメンバー呼び出し-なぜですか?

  22. 22

    constexprパラメーター化された関数ポインター

  23. 23

    メンバー関数を指す関数ポインター

  24. 24

    メンバー関数の特性

  25. 25

    メンバー関数のdecltype

  26. 26

    Constメンバー関数とtypedef、C ++

  27. 27

    クラスメンバー関数

  28. 28

    * thisおよびconstメンバー関数

  29. 29

    メンバー関数への参照

ホットタグ

アーカイブ