C++11统一初始化和函数重载

C++11 Uniform Initialization and function overloading

简单程序:

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

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

这在 C++11 标准草案 13.3.3.1.5 [over.ics.list] 中有说明:

Otherwise, if the parameter type is not a class:

[...]

  • 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 ]

因此身份转换比构造函数调用更好。

我们之所以得到一个nullptr,是因为它是对指针进行初始化的值。来自 8.5.4 [dcl.init.list]:

List-initialization of an object or reference of type T is defined as follows:

[...]

  • Otherwise, if the initializer list has no elements, the object is value-initialized. [ Example:

    int** pp {}; // initialized to null pointer
    

—end example ]