No exemplo a seguir, os argumentos da função são usados para testar com uma expressão requer se uma expressão que os utiliza está bem formada. A expressão requer não requer argumentos; ele usa diretamente as variáveis no escopo da função:
#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);
}
O código acima é compilado com o ramo de conceitos Clang. No entanto, o GCC10 aceita apenas a chamada para Resize
. ICEs do GCC9. Clang está certo em aceitá-lo?
Resize
e Eziser
devem ser rejeitados) ou ambas as funções devem ser compiladas. Eu diria que o clang está certo.