根据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字符串转换吗?
答案 0 :(得分:4)
这不是明确的意思。也许用一个例子说明它是最容易的:
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*
。