[英]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]草案中有所說明:
否則,如果參數類型不是類:
[...]
如果初始化列表沒有元素,則隱式轉換序列是標識轉換。 [例如:
void f(int); f( { } ); // OK: identity conversion
- 末端的例子]
所以身份轉換會比構造函數調用更好。
我們得到nullptr的原因是因為它是初始化指針的值。 從第8.5.4
節[dcl.init.list] :
列表初始化對象或類型T的引用定義如下:
[...]
否則,如果初始化列表沒有元素,則對象進行值初始化。 [例如:
int** pp {}; // initialized to null pointer
- 末端的例子]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.