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");
} |
-
它使用const char *调用string的构造函数(我假设这是std::string)。 请注意,"hello"不是const char *,而是const char[6]。
-
但是,const char[6]降级为const char*,这允许将这样的文字传递给这样的构造函数。
上面代码中的str初始化具有与以下相同的语义:
实际上,这就是所谓的复制初始化。 假设string为std::string,则存在一个构造函数,该构造函数采用单个const char*类型的参数,即string::string(const char*)。 该构造函数将被调用进行初始化。 调用此构造函数会创建一个string类型的临时对象。 然后,调用string的copy或move构造函数从临时目录初始化str。 通常,多余的复制或移动被忽略,尽管名称为"复制初始化",但复制和移动构造函数都不会被调用。
-
如果没有复制,那么修改str会修改按值传递的原始字符串吗? 或者您是说编译器将自动使用rvalue参数生成此函数的版本,并且仅在传递rvalue时才跳过复制?
-
@ user1316208我的意思是删除了临时文件,因此将const char *指向的字符串直接复制到要初始化的std :: string中。