В 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);