std::string s = (std::string)"a" + "b" + "c"; 可以吗?

4

它能正常工作,没有崩溃。这样可以吗?

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

感谢大家的反馈。


我想你的意思是 std::string s = (std::string) ("a" + "b" + "c"); 对吗? - BlackBear
@BlackBear 那甚至不会编译,因为你不能将指针相加。 - Timbo
@BlackBear:那样做会失败。他的代码将“a”转换为字符串对象,然后进行连接操作。而你的代码尝试添加两个指针,这样会失败。 - Bill Lynch
3
@sharth @Timbo:您的意思是数组。 :) (它们会衰变为指针,然后失败,是的。) - GManNickG
@shart @Timbo @kristopher:哎呀,你们说得对。 ;) - BlackBear
显示剩余2条评论
5个回答

6

是的。加号+是从左往右结合的,因此它等同于((std::string)"a" + "b") + "c"std::string::operator+被重载以接受const char *作为参数。


5

好的。没问题。

这基本上相当于执行

std::string s = "a";
s += "b";
s += "c";

实际上,您的解释比主题作者更有效:您只有一个字符串对象,而他创建了三个“const string”。 - ssmir
@ssmir:他可能会创建三个std::string,但肯定不会有任何一个是const。它们可能会被编译器省略,而移动语义肯定会消除这三个字符串。 - GManNickG
@GMan 是的,不是 const。谢谢。 - ssmir

2

(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。一旦初始化完成,所有临时变量都按照它们构造的相反顺序被销毁。

这种初始化是有效的,并且具有明确定义的行为。


嘿,感谢你。所以它不像原始类型 - 我以为会一样。 (int) "hello" 或 (char *) n,会像我描述的那样行事。 - Mark

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对象,因此试图将指针相加。 为了避免这种情况,您必须在char *术语的左侧或右侧具有std::string类型的术语。


1

会更好:

std::string s(std::string("a") + "b" + "c");

1
我不明白为什么那样会更好。 - GManNickG
@GMan,更像C++。 :) - ThomasMcLeod
也许吧。我认为你关于不使用C风格的强制类型转换的观点,也涉及到了复制初始化的丢失,这使得代码更易读。 - GManNickG
3
如果你要改进它,为什么不彻底改进呢?std::string s("abc"); - Benjamin Lindley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接