"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 > Por que não posso usar `if constexpr` em funções não modeladas em C++ 17?

Por que não posso usar `if constexpr` em funções não modeladas em C++ 17?

Publicado em 2024-11-26
Navegar:926

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

"if constexpr" limitado a funções de modelo

Em C 17, a introdução de "if constexpr" despertou interesse em seu capacidade de executar código condicionalmente com base em constantes de tempo de compilação. No entanto, surge um problema ao tentar usá-lo em funções não padronizadas.

Considere o seguinte código:

#include 
#include 

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v)
    std::cout 

Embora este código seja compilado sem erros em funções de modelo, ele falha com um erro de compilação quando colocado em uma função não-modelo como print. A razão está no comportamento de "if constexpr."

"if constexpr" foi projetado para permitir a compilação condicional do código do modelo. Em uma função de modelo, o compilador deduz o tipo do parâmetro em tempo de compilação, permitindo a seleção do caminho de código apropriado com base no tipo. Neste caso, quando a função de impressão é modelada, ela pode identificar se o valor é um ponteiro em tempo de compilação e executar a ramificação de código correspondente.

No entanto, em uma função não modelada, o tipo de valor é conhecido apenas em tempo de execução, tornando "if constexpr" ineficaz. O compilador trata ambas as ramificações da condicional como código executável, levando ao erro de compilação ao tentar desreferenciar o valor no Ptr para ramificar quando o valor é um número inteiro.

Para evitar esse problema, é necessário colocar " if constexpr" dentro de uma função de modelo ou fornecer informações de tipo explícitas para a função não modelo para garantir a dedução de tipo em tempo de compilaçã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