support - string to char c++




Por que char{} e char() funcionam como uma variável temporária para um argumento char*? (2)

No Visual C ++ 2017 (com /std:c++14 ou com /std:c++17 ), o código a seguir funciona:

void TakePtr(char*); // const or not

int main()
{ 
     TakePtr(char{});
     TakePtr(char());
}

Eu não entendo porque isso funciona.

Aparentemente, o seguinte também funcionaria (como esperado):

void TakeChar(char);

   TakeChar(char{});
   TakeChar(char());

Como o compilador deduz (ou converte) o tipo char para char* , quando char{} ou char() é usado como um argumento?

Agora, se eu tiver ambas as sobrecargas char e char* , ele funcionará sem nenhum erro / aviso sobre a ambigüidade:

void TakePtr(char*);
void TakePtr(char);

    TakePtr(char{});  // Chooses 'char'
    TakePtr(char());  // Chooses 'char'

Por que o compilador está bem com o char{} para TakePtr(char*) ? E por que não dá um aviso / erro ao escolher a melhor versão? Tal comportamento está destinado a quebrar o código existente.

Com certeza, o compilador não está feliz com:

void TakePtr(char*);

    char c{};
    TakePtr(c);

Isso é simplesmente o MSVC estar por trás: a regra em C ++ 03 era que qualquer expressão constante do tipo inteiro e valor 0 era uma constante de ponteiro nulo e poderia, portanto, ser convertida em char* . Certamente char() qualifica - e char{} significa a mesma coisa, embora nunca se sobreponha à regra.


Porque Visual mente muito. Especialmente mais antigo. Seu código solicita clang para relatar um erro:

<source>:9:6: error: no matching function for call to 'TakePtr'

     TakePtr(char{});

     ^~~~~~~

<source>:5:6: note: candidate function not viable: no known conversion from 'char' to 'char *' for 1st argument

void TakePtr(char*); // const or not

     ^

<source>:10:6: error: no matching function for call to 'TakePtr'

     TakePtr(char());

     ^~~~~~~

<source>:5:6: note: candidate function not viable: no known conversion from 'char' to 'char *' for 1st argument

void TakePtr(char*); // const or not

     ^

2 errors generated.

Visual é conhecido por ser "vacilante" em termos de seguir o padrão C ++, então não confie muito nele. Tente verificar com o clang / gcc, só para ter certeza.







visual-c++-2017