Nel seguente esempio, gli argomenti della funzione vengono utilizzati per verificare con un'espressione obbligatoria se un'espressione che li utilizza è ben formata. L'espressione richiede non accetta argomenti; utilizza direttamente le variabili nell'ambito della funzione:
#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);
}
Il codice sopra si compila con il ramo dei concetti di Clang. Tuttavia, GCC10 accetta solo la chiamata a Resize
. GCC9 ICE. Clang ha ragione ad accettarlo?
Resize
e Eziser
dovrebbero essere rifiutati) o entrambe le funzioni dovrebbero essere compilate. Direi che clang ha ragione.