Согласно cplusplus.com, это реализация класса std :: runtime_error:
class runtime_error : public exception {
public:
explicit runtime_error (const string& what_arg);
};
Поскольку конструктор является явным, я ожидал, что он будет принимать только объекты std :: string.
throw std::runtime_error("error message");
Этот код компилируется (GCC), хотя. Разве компилятор не должен жаловаться на неявное преобразование const char * в const?
Это не то, что явно означает здесь. Может быть, проще всего это проиллюстрировать на примере:
struct Foo
{
explicit Foo(const std::string& s) {}
};
void bar(const Foo&) {}
int main()
{
Foo f("hello"); // OK: explicit construction from std::string
Foo f2 = std::string("hello"); // ERROR
std::string s;
bar(s); // ERROR
}
Здесь explicit
Конвертирующий конструктор означает, что вы не можете неявно построить Foo
из std::string
, Но вы все еще можете построить std::string
из const char*
,