"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 > A análise mais irritante: Timer() - Chamada de objeto ou função?

A análise mais irritante: Timer() - Chamada de objeto ou função?

Publicado em 2024-12-21
Navegar:866

The Most Vexing Parse: Timer() - Object or Function Call?

Análise mais incômoda: desvendando a ambiguidade em C 11

A ambiguidade da "análise mais incômoda" em C 11 se apresenta ao usar inicializadores uniformes, conforme evidenciado no seguinte trecho de código:

#include 

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

Compreendendo a primeira expressão (auto dv = Timer())

Na primeira expressão, a palavra-chave auto implica que o tipo de dv é inferido do inicializador no lado direito do sinal de igual (=). O inicializador é uma chamada ao construtor Timer sem argumentos, que retorna um objeto Timer. Portanto, dv é um objeto do tipo Timer.

Compreendendo a segunda expressão (int time_keeper(Timer()))

Na segunda expressão, a ambiguidade surge porque o compilador não pode determinar se Timer() é uma chamada de função ou um objeto do tipo Timer passado por referência.

  • Se Timer() for uma chamada de função, então int time_keeper(Timer()) declara uma função chamada time_keeper que recebe um objeto Timer como entrada e retorna um int.
  • Se Timer() for um objeto do tipo Timer, então int time_keeper(Timer()) declara uma função chamada time_keeper que usa um ponteiro para um objeto Timer como entrada e retorna um int.

No entanto, como as funções decaem para ponteiros quando passadas como argumentos, o O verdadeiro tipo de time_keeper é int(Timer(*)()), que resolve a ambiguidade em favor da interpretação do ponteiro para a função.

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