这个演员让我感到困惑:
#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";
答案 0 :(得分:6)
是的,如果你有一个构造函数,它接受一个像这样的参数,它将用于将参数类型转换为对象类型。这就是为什么我们可以将const char*
传递给带字符串的函数。
答案 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)
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
这充当转换运算符。如果将字符串文字强制转换为std::string
,它将调用此构造函数并创建临时std::string