"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > O argumento do modelo `std::function` influencia seu tipo durante a construção do objeto?

O argumento do modelo `std::function` influencia seu tipo durante a construção do objeto?

Publicado em 13/12/2024
Navegar:755

Does the Template Argument of `std::function` Influence its Type During Object Construction?

O argumento do modelo de std::function está incluído em seu tipo?

Introdução ao problema

Ao empregar o modelo std::function, ambiguidade pode surgir devido a múltiplas sobrecargas plausíveis. Especificamente, considere o seguinte trecho de código:

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

A ambigüidade decorre do fato de que function e function podem ser construídas a partir de um ponteiro de função genérico. Isso introduz múltiplas correspondências potenciais para sobrecargas da função a.

Resolução de ambiguidade

A assinatura do argumento do modelo para std::function é considerada parte de seu tipo durante a declaração e definição. No entanto, este não é o caso durante a construção do objeto.

std::function, como muitos objetos funcionais em C , usa uma técnica chamada apagamento de tipo. Isso permite aceitar objetos ou funções arbitrárias, desde que satisfaçam a assinatura esperada quando chamados. A desvantagem é que erros relacionados a assinaturas incompatíveis ocorrem profundamente na implementação, e não no nível do construtor.

Contornando a ambiguidade

Existem três opções principais para contornar essa ambiguidade:

  • Conversão de tipo explícito: Converta manualmente os ponteiros de função para a assinatura específica exigida pelo pretendido sobrecarga.
  • Function Object Wrapping: Crie um objeto de função do tipo apropriado e passe-o.
  • Metaprogramação de modelo (TMP): Use TMP para gerar uma função com a assinatura desejada, evitando conversões explícitas.

Conclusão

Enquanto o argumento do modelo de std::function determina seu tipo durante declarações e definições, mas não desempenha nenhum papel na construção do objeto. Isto pode levar à ambiguidade quando os construtores aceitam argumentos arbitrários. Para resolver isso, os programadores podem usar conversão de tipo explícita, encapsulamento de objeto de função ou TMP.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3