1. ホーム
  2. c++

[解決済み] なぜ、requiresは必要なのか?

2022-04-14 19:32:15

質問事項

C++20のコンセプトのコーナーの1つに、以下のように書かなければならない状況があります。 requires requires . 例えば、この例では [expr.prim.req]/3 :

A requires-expression を使用することもできます。 require-clause(要求節 ([temp]) のようなテンプレート引数に対するアドホックな制約を記述する方法として、以下のようなものがあります。

template<typename T>
  requires requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

最初に必要なのは requires-句 を導入し、2番目は require-expression .

その2つ目の必要な技術的な理由は何でしょうか? requires というキーワードがあります。なぜ、書くことを許さないのか。

template<typename T>
  requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

<サブ (注意:文法が違うとは答えないでください。 requires それ)

解決方法は?

文法上必要だからです。それはそうです。

A requires 制約は が必要です。 を使用します。 requires の式で表されます。多かれ少なかれ任意のブーリアン定数表現を使用することができる。したがって requires (foo) は、正規の requires の制約を受けます。

A requires 表現 (あるものがある制約に従うかどうかをテストするもの)は別の構成要素で、同じキーワードで導入されるだけです。 requires (foo f) は、有効な requires の式で表されます。

あなたが望むのは、もしあなたが requires を、制約を受け入れる場所で作成することができるようにする必要があります。 requires 節があります。

そこで問題です。 requires (foo) を requires 制約に適した場所に配置します。パーサーはどこまで進んだら、これが requires 制約であることを認識できるのでしょうか? 制約 制約+式」ではなく、「制約+式」にしたいのですか?

これを考えてみましょう。

void bar() requires (foo)
{
  //stuff
}

もし foo が型である場合 (foo) は requires 式のパラメータリストであり、その中のすべては {} は関数の本体ではなく、その requires の式で表されます。それ以外の場合は foo の中の式です。 requires 節があります。

まあ、コンパイラはただ単に何が foo が先です。しかし、C++の 本当に トークンのシーケンスを解析する基本的な行為で、トークンの意味を理解する前に、コンパイラが識別子の意味を理解する必要があるのは嫌なものです。確かに、C++は文脈依存型なので、このようなことは起こります。しかし、委員会は可能な限りこれを避けたいと考えています。

そう、文法なんですね。