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?
c++
c++20
c++-concepts
metalfox
fonte
fonte
Resize
eEziser
devem ser rejeitados) ou ambas as funções devem ser compiladas. Eu diria que o clang está certo.Respostas:
Sim, uma expressão de necessidade pode usar qualquer coisa que esteja no escopo. Afinal, ele precisa apenas do tipo de qualquer coisa que nomear, exceto em um requisito aninhado ou em outra expressão constante. Isso vale tanto para declarações vizinhas quanto para seus próprios parâmetros (formais).
[expr.prim.req] / 5 :
fonte