对于 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
一起正常工作。
问题是为什么?从程序员的角度来看,它可能会令人困惑
错觉。
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
对应的重载。
重载解析倾向于将 {} 视为某种基本类型而不是某种容器。
例如:
#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
一起正常工作。
问题是为什么?从程序员的角度来看,它可能会令人困惑 错觉。
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
对应的重载。