4
簡單的程序:C++ 11的統一初始化和函數重載
void f(const std::string& s);
void f(const char* p);
f({});
爲什麼鐺調用f((const char*)nullptr)
?我期望編譯器警告關於模糊的調用。
簡單的程序:C++ 11的統一初始化和函數重載
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
末端示例]