char []如何在参数中解释为const std :: strings

时间:2010-12-24 02:23:11

标签: c++ string

我最近意识到我可以这样做:

void someFunc(const std::string &str)
{
   //content
}

...
someFunc("Hello World"); //this works

我想知道它是如何工作的以及它的工作原理。

由于

6 个答案:

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

这是由implicit conversion in C++

引起的

答案 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());