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?
Resize
und Eziser
sollten abgelehnt werden) oder beide Funktionen kompiliert werden sollten. Ich würde sagen, Klirren ist richtig.