4

简单的程序:

void f(const std::string& s);
void f(const char* p);
f({});

为什么叫叮当f((const char*)nullptr)?我已经预料到编译器会发出关于模糊调用的警告。

4

1 回答 1

3

这在草案 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
    

—结束示例]

于 2015-11-02T14:25:48.687 回答