В Visual C ++ 2017 (с /std:c++14
или с /std:c++17
) работает следующий код:
void TakePtr(char*); // const or not
int main()
{
TakePtr(char{});
TakePtr(char());
}
Я не понимаю, почему это работает.
По-видимому, также будет работать следующее (как и ожидалось):
void TakeChar(char);
TakeChar(char{});
TakeChar(char());
Как компилятор выводит (или конвертирует) тип char
в char*
, когда char{}
или char()
используется в качестве аргумента?
Теперь, если у меня есть перегрузки char
и char*
, это работает без каких-либо ошибок / предупреждений о неоднозначности:
void TakePtr(char*);
void TakePtr(char);
TakePtr(char{}); // Chooses 'char'
TakePtr(char()); // Chooses 'char'
Почему компилятор в порядке с char{}
для TakePtr(char*)
?
И почему он не выдает предупреждение / ошибку при выборе версии лучше ? Такое поведение неизбежно нарушает существующий код.
Конечно, компилятор недоволен:
void TakePtr(char*);
char c{};
TakePtr(c);