它有效,没有崩溃。可以吗?
编辑:我问的原因是std::string s = "a" + "b" + "c";
产生编译器错误,而(std::string)"a"
只是告诉编译器,“只是假设”指向的是一个std :: string“。我实际上并不知道如何实现std :: string。
感谢大家的反馈。
答案 0 :(得分:6)
是。 +
是左关联的,因此它等同于((std::string)"a" + "b") + "c"
。重载std::string::operator+
以获取const char *
作为参数。
答案 1 :(得分:5)
是。没关系。
这大致相当于做
std::string s = "a";
s += "b";
s += "c";
答案 2 :(得分:2)
(std::string)"a"
只是告诉编译器,“只需假设"a"
所指的是std::string
”
不,这不是对象类型的强制转换意味着什么。对对象类型的强制转换是转换的显式请求。 (std::string)"a"
表示“从文字(std::string
)const char[]
构建临时"a"
。
在声明std::string s = (std::string)"a" + "b" + "c";
中,此临时值一直存在,直到s
的初始化完成。 (12.2 [class.temporary] / 4)
有(至少)两个临时构建,将operator+
应用于第一个临时和"b"
的结果以及将operator+
应用于该临时和{{1}的结果最后一个临时用于复制初始化"c2"
。一旦初始化完成,所有的临时工作都会按照它们构造的相反顺序销毁。
初始化有效且行为定义良好。
答案 3 :(得分:1)
std::string
有一个成员函数operator +
,它接受const char *
类型的右手参数。还有一个全局定义的operator +
,允许const char *
位于运营商的左侧。
// std::string::operator + (const char *)
std::string a;
a = "b";
// global operator + (std::string, const char *)
std::string a;
a = (std::string)"b" + "c";
// global operator + (const char *, std::string)
std::string a;
a = "b" + (std::string)"c";
由于字符串文字的类型为std::string
,因此必须将参数类型转换为const char *
。执行"a" + "b"
的问题是编译器在赋值语句中没有类型std::string
的对象,因此尝试将指针添加到一起。为避免这种情况,您必须在std::string
字词的左侧或右侧使用char *
类型的术语。
答案 4 :(得分:1)
会更好:
std::string s(std::string("a") + "b" + "c");