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 ]
简单程序:
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 ]