在 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{}
for TakePtr(char*)
?为什么在选择更好的版本时不给出警告/错误?这种行为势必会破坏现有代码。
当然,编译器不满意:
void TakePtr(char*);
char c{};
TakePtr(c);