2016-03-08 3 views
1

Я наткнулся на это, не получив «не экземпляр для конструктора» ошибки при использовании std::out_of_range constructor кода со старыми компиляторамистрока автоматически преобразует константный символ * в STD :: строка

Для некоторых старых компиляторов определение 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

Смежные вопросы