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.
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.
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