为什么std :: string连接在一个表达式中会产生与char不同的结果?

时间:2017-08-21 13:05:51

标签: c++ string stl

我正在从std :: string的中间连接3个字符。如果我用char做char,我会得到预期的结果,但如果我只在一个表达式中做,我会得到一个奇怪的结果。为什么呢?

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string s1 = "abcdefghijklmnopq";
    string s2 = "";
    string s3 = "";

    s3+=s1[4];
    s3+=s1[5];
    s3+=s1[6];
    cout << s3 << endl;  // Expected behaviour

    s2=s1[4]+s1[5]+s1[6];
    cout << s2 << endl;  // ?????
}

1 个答案:

答案 0 :(得分:8)

s1[4]+s1[5]+s1[6]使用+类型的内置char:每个参数都提升为int,表达式为int类型。将此值分配给s2时,会调用重载的=运算符到char,并且在分配之前将表达式截断为char。如果您的平台上charsigned,那么这是实施定义。请参阅http://en.cppreference.com/w/cpp/language/implicit_conversion

s3+=s1[4];公司使用+=上的重载std::string运算符作为char参数。这被定义为char连接到字符串

最后从C ++ 14开始,你可以使用漂亮的

s2 = ""s + s1[4] + s1[5] + s1[6];

如果substr无法解决问题(s2 = s1.substr(4, 3);会在这种情况下完成工作)。请注意C ++ 14标准库中定义的用户定义的文字 ""s