2013-03-11 48 views
5

我最近碰到一個類來了,如同下面重載的構造 - constructur與布爾的說法具有優先

class Foo { 
public: 
    Foo(std::string msg) {} 
private: 
    Foo(bool b) {} 
}; 

我注意到,試圖通過

Foo foo("blah"); 

原因手段來創建這個類的一個對象編譯錯誤告訴Foo::Foo(bool)是私人的。顯然,如果參數不是一個實際的std :: string,編譯器更喜歡使用帶有參數bool的構造函數。另一方面,如果私人構造函數沒有給出,上面的代碼編譯就好了。

爲什麼「bool-constructor」的優先級高於「string-constructor」?如果傳遞的參數類型不適合其中的任何一個?這只是一個定義問題,還是它有更深的含義和一些很好的理由?

+0

不能確定*爲什麼*,但他們應該(可能)都是「明確的」。 – 2013-03-11 16:00:40

+0

實際上,顯式關鍵字不會改變行爲 – symphonic 2013-03-11 16:02:16

+0

它不會在這種情況下。 – 2013-03-11 16:07:58

回答

7

原因與轉換運算符優先級有關。每個呼叫包括一個隱式轉換

  1. 指針 - >std::string
  2. 指針 - >bool

在這種情況下#1是一個用戶定義的轉換和#2是所定義的語言/編譯器一。用戶定義的轉換優先級低得多,因此其他轉換優先。

編輯

這裏有一個類似的問題,其在優先檢查的深入說明有更多的參與

conversion precedence in c++

+0

這是在規範某處? – Nick 2013-03-11 16:04:20

+2

@nick在附錄B.2中查看 – JaredPar 2013-03-11 16:05:26

+1

如果通過speck指代您的意思是標準,那麼它在**§13.3.3.2.2**中:*當比較隱式轉換序列的基本形式時[012] - 標準轉換序列是比用戶定義的轉換更好的轉換序列 sequence *(const char * - > bool是標準轉換序列) – 2013-03-11 16:13:24