为什么char {}和char()用作char *参数的临时变量?

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)

编译器如何演绎(或转换)的类型charchar*char{}char()用作论据?

现在,如果我同时拥有charchar*重载,那么它可以正常工作而不会出现任何错误/警告歧义:

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进行验证。


Dav*_*ing 3

这只是 MSVC 的幕后黑手:C++03 中的规则是任何整数类型且值为 0 的常量表达式都是空指针常量,因此可以转换为char*. 当然char()限定\xe2\x80\x94并且char{}意味着同样的事情,尽管它从未与规则重叠。

\n