std :: runtime_error中的显式构造函数

时间:2014-05-27 18:22:45

标签: c++ constructor explicit

根据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字符串转换吗?

1 个答案:

答案 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*