我最近意识到我可以这样做:
void someFunc(const std::string &str)
{
//content
}
...
someFunc("Hello World"); //this works
我想知道它是如何工作的以及它的工作原理。
由于
答案 0 :(得分:5)
它有效,因为std::string
有一个const char *
的构造函数未标记为explicit
。如果需要,C ++编译器将插入对一个这样的构造函数(每个参数)的调用,以使参数匹配。
答案 1 :(得分:4)
您的示例实际上表明了相反的情况:const char数组被解释为std::string
。 (顺便说一句,字符串文字不是const char *
,它是const char[N]
- 字符数组,而不是字符指针。)
它起作用的原因是char数组可以通过std::string
转换构造函数隐式转换为std::string
。编译器为您执行转换,完全符合C ++语言的重载决策规则。
答案 2 :(得分:3)
这是有效的,因为编译器在调用std::string
之前在调用者中创建了类型为someFunc()
的临时对象。
编译后的代码大致等同于以下内容:
{
std::string _temp1("Hello World");
someFunc(_temp1);
}
(我把代码放在大括号中,表明在调用_temp1
后会立即执行someFunc()
析构函数。)
答案 3 :(得分:0)
答案 4 :(得分:0)
你的问题是倒退的... const char*
在用作参数时变为std::string
,这是因为{{1}有一个隐式转换(带有一个参数的构造函数) } const char*
。
答案 5 :(得分:0)
我认为你的意思相反:'const char * s如何被解释为std :: strings'?好吧,有一个std :: string类的构造函数,它将const char *转换为std :: string
实际的构造函数可以在/usr/include/c++/4.3.4/bits/basic_string.h中找到
/**
* @brief Construct string as copy of a C string.
* @param s Source C string.
* @param a Allocator to use (default is default allocator).
*/
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());