对于 C++ 重载解析,为什么 {} 比 string 更适合成为 int?

Why {} is better candidate to be int than string for C++ overload resolution?

重载解析倾向于将 {} 视为某种基本类型而不是某种容器。

例如:

#include <iostream>
#include <string>

void foo(const std::string&) {std::cout << "string\n";}
void foo(int) {std::cout << "int\n";}

int main() { foo({}); }

编译时没有任何诊断和输出:

int

https://godbolt.org/z/zETfrs5as

如果注释掉 int 重载,那么它可以与 string 一起正常工作。

问题是为什么?从程序员的角度来看,它可能会令人困惑 错觉。

来自over.ics.list#9.2

if the initializer list has no elements, the implicit conversion sequence is the identity conversion. [ Example:

 void f(int);

 f( { } );               // OK: identity conversion

 — end example ]

因此,从{}int的转换是身份转换,而{}const std::string&是user-defined的转换。并且由于恒等转换比较匹配,所以会选择int对应的重载。