简单的程序:
void f(const std::string& s);
void f(const char* p);
f({});
为什么叫叮当f((const char*)nullptr)
?我已经预料到编译器会发出关于模糊调用的警告。
简单的程序:
void f(const std::string& s);
void f(const char* p);
f({});
为什么叫叮当f((const char*)nullptr)
?我已经预料到编译器会发出关于模糊调用的警告。
这在草案 C++11 标准部分13.3.3.1.5
[over.ics.list]中有介绍,其中说:
否则,如果参数类型不是类:
[...]
如果初始化列表没有元素,则隐式转换序列是恒等转换。[ 例子:
void f(int); f( { } ); // OK: identity conversion
—结束示例]
所以身份转换会比构造函数调用更好。
我们得到一个 nullptr 的原因是因为它是初始化指针的值。从8.5.4
[dcl.init.list]部分:
类型 T 的对象或引用的列表初始化定义如下:
[...]
否则,如果初始化列表没有元素,则对象被值初始化。[ 例子:
int** pp {}; // initialized to null pointer
—结束示例]