必要な式は、囲んでいるスコープの変数を「キャプチャ」することを許可されていますか?


10

次の例では、関数の引数を使用してrequire式を使用し、それらを使用する式が整形式であるかどうかをテストしています。require式は引数を取りません。関数スコープ内の変数を直接使用します。

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

上記のコードは、Clangコンセプトブランチでコンパイルされます。ただし、GCC10はへの呼び出しのみを受け入れますResize。GCC9 ICE。Clangはそれを受け入れますか?


2
ICEは常にコンパイラの問題です。
Jarod42

私はそれはそれはローカル変数をキャプチャするために許可されていない場合(その両方のコードを拒否すべきであるいずれかのことを言うだろうResizeEziser拒絶する必要があります)、あるいは両方の機能をコンパイルする必要があります。クランは正しいと思います。
Jarod42

@ Jarod42はい。GCCの動作には明らかにバグがあります。私は広報を提出します。Clangも正しいと思いますが、確認したいと思います。
metalfox

回答:


6

はい、requires-expressionはスコープ内のあらゆるものを使用できます。ネストされた要件やその他の定数式を除いて、必要なのは結局のところ、名前を付けるもののタイプだけです。これは、それ自体の(正式な)パラメータと同じくらい、周囲の宣言にも当てはまります。

[expr.prim.req] / 5

要件-体は、一連の含まれている要件を。これらの 要件は、ローカルパラメータ、テンプレートパラメータ、およびそれを囲むコンテキストから可視のその他の宣言を参照する場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.