我很好奇复合赋值运算符是否对多个参数有效。我的猜测是+ =不会有副作用,但可能与“-=”的情况不同。
std::string a;
a += "Hello" + " "+"World"; // doesn't compile
std::string name = "Old";
a += "Hello" + name +"World"; // compiles
答案 0 :(得分:4)
这不是有效的表达式,因为字符串文字没有运算符+
"Hello" + " "+"World
(更精确的说是指针,因为在表达式中,具有极少数例外的字符串文字会转换为指向其第一个符号的指针。)
相反,您可以写
std::string a;
( ( a += "Hello" ) += " " ) += "World";
但是写起来会更容易阅读
a += "Hello";
a += " ";
a += "World";
或者如 @Bathsheba 所述,在对我的回答的(很有价值的)评论中,您可以通过以下方式使用用户定义的字符串文字
#include <string>
#include <iostream>
int main()
{
using namespace std::string_literals;
std::string a;
a += "Hello"s + " " + "World";
std::cout << a << '\n';
}
至此声明
a += "Hello" + name +"World";
然后可以使用为类std::basic_string
定义的运算符来重写它
template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
和
template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
喜欢
a += operator +( operator +( "Hello", name ), "World" );
例如
#include <string>
#include <iostream>
int main()
{
std::string a;
std::string name = "Old";
a += operator +( operator +( "Hello ", name ), " World" );
std::cout << a << '\n';
}
请注意,每个运算符都返回类型std::basic_string
的对象,该对象已定义了operator +
。也就是说,在每次操作员调用中,都存在一个std::basic_string
类型的对象作为参数。
答案 1 :(得分:4)
复合赋值运算符function linkResolver(doc) {
if (doc.type === 'home_page') return `/`;
if (doc.type === 'pricing_page') return `/pricing`;
if (doc.type === 'service_page') return `/services/${doc.uid}`;
if (doc.type === 'about_page') return `/${doc.uid}`;
if (doc.type === 'resource_page') return `/resources/${doc.uid}`;
return '/';
}
不在其中。
您可以将+=
与+=
一起使用,因为it defines the relevant overload,但是它只能得到一个参数。
您已经尝试传递通过std::string
多个字符串文字构造的表达式作为该参数。这将无法编译。
在此玩具盒中,有些替代方法可能会启发您针对实际情况的解决方案:
+
// Multiple calls to +=
std::string a;
a += "Hello";
a += " ";
a += "World";
// String literal concatenation!
std::string a;
a += "Hello" " " "World";
// Repeated std::string concat
std::string a;
a += std::string("Hello") + " " + "World";
// Same
using namespace std::string_literals;
std::string a;
a += "Hello"s + " " + "World";
答案 2 :(得分:2)
表达式a += "Hello" + " " + "World"
被分组为a += ("Hello" + " " + "World")
。
右侧是一组3个const char[]
文字。当应用于二进制加法时,它们会衰减到const char*
指针。由于无法添加指针,因此要求编译器发出诊断信息。
(请注意,表面上等效的表达式a = a + "Hello" + " " + "World"
是可编译的。)