2016-03-08 61 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

相关问题