usando o seguinte código
template <typename T>
concept SomeConcept = requires(T t) {
{ t++ } -> std::convertible_to<T>;
};
O conceito SomeConcept
garante que o tipo T
tenha sobrecarregado o operator++(int)
e o tipo de resultado seja conversível para T
. E std::convertible_to
recebe 2 parâmetros, o primeiro é From
, e o segundo é To
.
Então minha pergunta é: qual parâmetro recebe o resultado da expressão e por quê? E com essa resposta, por que ele T
é passado como o outro parâmetro e não o contrário?
Por favor, forneça uma referência adequada para respaldar a resposta, de preferência do rascunho padrão, se possível.
desde já, obrigado
De cppreference :
Então, mesmo que
std::convertible_to
aceite dois parâmetros de modelo, o tipo deduzido será usado como o primeiro, que é oFrom
parâmetro no seu caso.Vou tentar explicar isso.
Na expressão
{ t++ } -> std::convertible_to<T>
, o tipo de resultado det++
se torna oFrom
parâmetro destd::convertible_to
, enquantoT
é oTo
parâmetro.Isso ocorre porque
std::convertible_to<From, To>
verifica seFrom
pode ser convertido paraTo
. No nosso caso, queremos verificar se o resultado da operação de incremento pós-fixado (que normalmente é um objeto temporário contendo o valor original) pode ser convertido de volta para o tipoT
.O conceito padrão std::convertible_to é definido como:
Então, quando escrevemos
{ t++ } -> std::convertible_to<T>
, estamos efetivamente dizendo "o resultado det++
deve ser conversível paraT
", que é exatamente o que queremos verificar para um operador de incremento pós-fixado bem-comportado.Me avise se tiver alguma dúvida sobre minha resposta. Espero ter conseguido ajudar você.