为什么const char*可以转换为std::string?

6

这个转换让我感到困惑:

#include <string>
#include <iostream>
#include <memory>

using namespace std;

int main() {
    string str1 =  (string)"I cast this thing" +  " -- then add this";
    cout << str1 << endl;
}

有人能解释一下为什么这个C++风格的字符串强制转换是有效的(或者被允许)吗?我将生成的优化汇编代码与以下内容进行了比较:
string str1 =  string("I construct this thing") +  " -- then add this";

它们看起来是完全一样的,因此我感觉自己忘记了一些C++语法,这些语法实际上允许这种强制类型转换/构造互换。

 std::string str2 =  std::string("I construct this thing") +  " -- then add this";

3
(T)xT(x) 两者在意义上是相同的,只是名称不同(C 风格的强制类型转换和函数风格的强制类型转换)。 - Konrad Rudolph
2
参见:https://dev59.com/IXRC5IYBdhLWcg3wVvct - user2249683
3个回答

8

一个C风格的转换将会进行const、static或reinterpret转换,以可能的方式。

如果定义了,静态转换将使用用户定义的转换。

std::string有一个构造函数string(const char *)

语法std::string("something")static_cast<std::string>("something")(std::string)"something"是等效的。它们都将使用std::string::string(const char *)构造函数构造一个临时的std::string。语法之间唯一的区别就在于指针转换。


出于某种原因,我总是忘记在静态转换时考虑“有效的用户定义转换” ,但这在完整的意义上是有意义的。 - Mike Ellery

7

如果你有一个只接受一个参数的构造函数,它将被用来将参数类型转换为对象类型。这就是为什么我们可以将const char*传递给接受字符串的函数。

转换构造函数


4

std::string有一个以以下形式的构造函数

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

这是一个类型转换操作符。如果你将一个字符串字面量强制转换为std::string,它将调用此构造函数并创建一个临时的std::string


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接