Aja*_*jay 18 c++ c++14 c++17 visual-c++-2017
在Visual C ++ 2017(带有/std:c++14
或带有/std:c++17
)中,以下代码有效:
void TakePtr(char*); // const or not
int main()
{
TakePtr(char{});
TakePtr(char());
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。
显然,以下内容也将起作用(按预期方式):
void TakeChar(char);
TakeChar(char{});
TakeChar(char());
Run Code Online (Sandbox Code Playgroud)
编译器如何演绎(或转换)的类型char
来char*
时char{}
或char()
用作论据?
现在,如果我同时拥有char
和char*
重载,那么它可以正常工作而不会出现任何错误/警告歧义:
void TakePtr(char*);
void TakePtr(char);
TakePtr(char{}); // Chooses 'char'
TakePtr(char()); // Chooses 'char'
Run Code Online (Sandbox Code Playgroud)
为什么编译器可以接受char{}
for TakePtr(char*)
?当选择更好的版本时,为什么不给出警告/错误?这种行为势必会破坏现有代码。
当然,编译器对以下内容不满意:
void TakePtr(char*);
char c{};
TakePtr(c);
Run Code Online (Sandbox Code Playgroud)
Rad*_*ski 13
因为视觉很重要。尤其是年龄较大的一个。您的代码提示clang报告错误:
<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.
Run Code Online (Sandbox Code Playgroud)
在遵循C ++标准方面,Visual被认为是“奇异的”,因此不要过分依赖它。请确保使用clang / gcc进行验证。
这只是 MSVC 的幕后黑手:C++03 中的规则是任何整数类型且值为 0 的常量表达式都是空指针常量,因此可以转换为char*
. 当然char()
限定\xe2\x80\x94并且char{}
意味着同样的事情,尽管它从未与规则重叠。