为什么string :: append操作行为奇怪?

dav*_*vka -3 c++ linux gcc stl operator-precedence

看看下面的简单代码:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s("1234567890");
    string::iterator i1 = s.begin();
    string::iterator i2 = s.begin();
    string s1, s2;
    s1.append(i1, ++i1);
    s2.append(++i2, s.end());

    cout << s1 << endl;
    cout << s2 << endl;
}
Run Code Online (Sandbox Code Playgroud)

您对输出的期望是什么?

你会像我一样期望它是:

1
234567890
Run Code Online (Sandbox Code Playgroud)

错误!它是:

234567890
Run Code Online (Sandbox Code Playgroud)

即第一个字符串为空.

前缀增量运算符的接缝在迭代器中存在问题.还是我错过了什么?

Jer*_*fin 14

你错过了一些东西:这与迭代器无关.未指定评估函数的参数的顺序.因此,您的:append(i1, ++i1);将取决于未指定的行为,无论其类型如何i1.举个例子,给出一些更简单的东西:

void print(int a, int b) { 
    std::cout << a << " " << b << "\n";
}

int main() { 
    int a =0;
    print(a, ++a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您的输出可能完全合理地是您期望的"0 1",但它也可以完全合理地为:"1 1".由于这是未指定的,它可能会从编译器的一个版本更改为下一个版本,或者甚至在更改标志时使用相同的编译器,或者(理论上)可能会根据月亮的相位而变化...


erg*_*sys 8

C++实现可以任意顺序评估参数.在这种情况下,如果首先评估++ i1,您将得到一个空字符串.