次の例では、関数の引数を使用して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
私はそれはそれはローカル変数をキャプチャするために許可されていない場合(その両方のコードを拒否すべきであるいずれかのことを言うだろう
—
Jarod42
Resize
とEziser
拒絶する必要があります)、あるいは両方の機能をコンパイルする必要があります。クランは正しいと思います。
@ Jarod42はい。GCCの動作には明らかにバグがあります。私は広報を提出します。Clangも正しいと思いますが、確認したいと思います。
—
metalfox