簡體   English   中英

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]草案中有所說明:

否則,如果參數類型不是類:

[...]

  • 如果初始化列表沒有元素,則隱式轉換序列是標識轉換。 [例如:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM