Im folgenden Beispiel werden die Funktionsargumente verwendet, um mit einem erforderlichen Ausdruck zu testen, ob ein Ausdruck, der sie verwendet, gut geformt ist. Der Requires-Ausdruck benötigt keine Argumente. Es verwendet die Variablen im Funktionsumfang direkt:
#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);
}
Der obige Code wird mit dem Zweig Clang-Konzepte kompiliert. GCC10 nimmt jedoch nur den Anruf an an Resize. GCC9 ICEs. Hat Clang Recht, es zu akzeptieren?
Resizeund Ezisersollten abgelehnt werden) oder beide Funktionen kompiliert werden sollten. Ich würde sagen, Klirren ist richtig.