它能正常工作,没有崩溃。这样可以吗?
编辑:我问的原因是std::string s = "a" + "b" + "c";
会产生编译错误,而(std::string)"a"
只是告诉编译器,“假设“a”指向的是一个std::string”。我其实并不知道std::string是如何实现的。
感谢大家的反馈。
它能正常工作,没有崩溃。这样可以吗?
编辑:我问的原因是std::string s = "a" + "b" + "c";
会产生编译错误,而(std::string)"a"
只是告诉编译器,“假设“a”指向的是一个std::string”。我其实并不知道std::string是如何实现的。
感谢大家的反馈。
是的。加号+
是从左往右结合的,因此它等同于((std::string)"a" + "b") + "c"
。std::string::operator+
被重载以接受const char *
作为参数。
好的。没问题。
这基本上相当于执行
std::string s = "a";
s += "b";
s += "c";
std::string
,但肯定不会有任何一个是const
。它们可能会被编译器省略,而移动语义肯定会消除这三个字符串。 - GManNickGconst
。谢谢。 - ssmir
(std::string)"a"
只是告诉编译器,“假设"a"
指向一个std::string
”。
不,这并不是将对象类型转换的意思。将对象类型转换是显式请求进行转换。 (std::string)"a"
的意思是“从字面量(const char[]
)"a"
构造一个临时的std::string
”。
在声明std::string s = (std::string)"a" + "b" + "c";
中,这个临时值一直存在,直到初始化s
完成。(12.2 [class.temporary] / 4)
至少还会构造两个临时变量,一个是将第一个临时变量和"b"
应用operator+
后的结果,另一个是将这个临时变量和"c2"
应用operator+
后的结果。最后一个临时变量用于复制初始化s
。一旦初始化完成,所有临时变量都按照它们构造的相反顺序被销毁。
这种初始化是有效的,并且具有明确定义的行为。
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
对象,因此试图将指针相加。 为了避免这种情况,您必须在char *
术语的左侧或右侧具有std::string
类型的术语。
会更好:
std::string s(std::string("a") + "b" + "c");
std::string s("abc");
- Benjamin Lindley