2016-03-08 129 views
1

使用std::out_of_range constructor代碼與舊的編譯器字符串自動轉換爲const char *到的std :: string

對於一些老的編譯器,當我在此通過接收「沒有實例構造函數」錯誤迷迷糊糊的std::out_of_range的定義是

class out_of_range : public logic_error { 
public: 
     out_of_range(const string& message); 
}; 

在最近的版本,他們已經增加了第二個構造

class out_of_range : public logic_error { 
public: 
     out_of_range(const string& message); 
     out_of_range(const char *message); 
}; 

我是想合作的代碼mpile做了以下構造函數調用:

std::out_of_range("Some Error Message"); 

加入#include <string>

編譯器能夠const char*轉換爲std::string後?

這是預期的行爲?

+0

這與你可以做的原因相同。 'std :: string str =「foobar」;'見例如[這個'std :: string'構造函數參考](http://en.cppreference.com/w/cpp/string/basic_string/basic_string)以獲得更多信息(它是列表中標記爲'5'的構造函數,您應該看看)。 –

回答

5

是的,那是預期的,因爲相關的構造std::string::string(const char*)explicit,這意味着它可以轉換這樣的。

+0

另外,即使它試圖捕獲一個引用'const string&',它也允許編譯器創建一個臨時的並在通話時將它作爲參考傳遞。 – Deji

+1

@Deji:不僅允許,而且是強制性的。 – MSalters

相關問題