此字符串加法是否有效?

时间:2019-05-08 15:44:20

标签: c++ string operator-overloading string-literals user-defined-literals

我很好奇复合赋值运算符是否对多个参数有效。我的猜测是+ =不会有副作用,但可能与“-=”的情况不同。

std::string a; 
a += "Hello" + " "+"World"; // doesn't compile
std::string name = "Old";
a += "Hello" + name +"World"; // compiles

3 个答案:

答案 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多个字符串文字构造的表达式作为该参数。这将无法编译。

在此玩具盒中,有些替代方法可能会启发您针对实际情况的解决方案:

选项1

+

选项2

// Multiple calls to +=
std::string a;
a += "Hello";
a += " ";
a += "World";

选项3

// String literal concatenation!
std::string a; 
a += "Hello" " " "World";

选项4

// Repeated std::string concat
std::string a;
a += std::string("Hello") + " " + "World";

选项5

// 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"是可编译的。)