为什么const char *强制转换为std :: string有效?

时间:2016-01-12 17:50:42

标签: c++

这个演员让我感到困惑:

#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 个答案:

答案 0 :(得分:6)

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

Converting constructor

答案 1 :(得分:6)

C风格的演员阵容将进行常规演员和静态演员或重新演绎演员。

静态强制转换将使用用户定义的转换(如果已定义)。

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

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

答案 2 :(得分:4)

std::string的格式为constructor

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

这充当转换运算符。如果将字符串文字强制转换为std::string,它将调用此构造函数并创建临时std::string