实际将c ++ const char *转换为字符串会发生什么

what actually happen converting c++ const char * to string

我读过C ++ Primer,有人说,当我们使用'='运算符时,或者当函数参数是类类型的值或函数返回类型是类类型的值时,c ++将使用所谓的"复制" 初始化",这与"直接初始化"不同,后者根据参数查找相应的构造函数,"复制初始化"将使用"复制构造函数"。 因此,在下面的代码中,当我向Foo提供" hello"作为参数时,它应使用复制构造函数(字符串(const string&str))来初始化参数。 但是我的参数是" hello",它是一个const char *,那么const char *成为const字符串和参数的有效参数实际上发生了什么? 有人可以提供更详细的信息吗? 谢谢!

1
2
3
4
void Foo(string str){}
int main() {
    Foo("hello");
}


上面代码中的str初始化具有与以下相同的语义:

1
string str ="hello";

实际上,这就是所谓的复制初始化。 假设stringstd::string,则存在一个构造函数,该构造函数采用单个const char*类型的参数,即string::string(const char*)。 该构造函数将被调用进行初始化。 调用此构造函数会创建一个string类型的临时对象。 然后,调用string的copy或move构造函数从临时目录初始化str。 通常,多余的复制或移动被忽略,尽管名称为"复制初始化",但复制和移动构造函数都不会被调用。