std :: string s =(std :: string)“a”+“b”+“c”;好?

时间:2011-01-31 19:22:29

标签: c++

它有效,没有崩溃。可以吗?

编辑:我问的原因是std::string s = "a" + "b" + "c";产生编译器错误,而(std::string)"a"只是告诉编译器,“只是假设”指向的是一个std :: string“。我实际上并不知道如何实现std :: string。

感谢大家的反馈。

5 个答案:

答案 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::stringconst 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");