Вопрос

посмотрите на следующий простой код:

#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;
}

какой результат вы ожидаете?

Вы, как и я, ожидаете, что это будет:

1
234567890

неправильный!это:

234567890

то естьпервая строка пуста.

Судя по всему, оператор приращения префикса проблематичен с итераторами.или я что-то упускаю?

Это было полезно?

Решение

Это не ошибка.

Порядок, в котором аргументы

s1.append(i1, ++i1);

оцениваются, не указано в стандарте.Компилятор волен использовать любой порядок по своему выбору.В этом случае он оценивает второй аргумент (++i1) перед первым (i1) и вы указываете нулевой диапазон для копирования.

Другие советы

Вы что-то упускаете:это действительно не имеет ничего общего с итераторами.Порядок, в котором оцениваются аргументы функции, не указан.Таким образом, ваш: 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;
}

Вполне разумно, что ваш вывод может быть ожидаемым «0 1», но также вполне обоснованно может быть:«1 1».Поскольку это не указано, оно может меняться от одной версии компилятора к другой или даже от одного и того же компилятора при изменении флагов или (теоретически) может меняться в зависимости от фазы луны...

Реализации C++ могут оценивать аргументы в любом порядке.В этом случае, если сначала вычисляется ++i1, вы получите пустую строку.

Стандарт C++ ничего не определяет о порядке вычисления аргументов функции, что делает его зависящим от реализации.C++ требует, чтобы аргументы функции были полностью оценены (и опубликованы все побочные эффекты) до входа в функцию, но реализация может оценивать аргументы в любом порядке.

В твоем случае i++ был оценен до того, как оба параметра стали одинаковыми, что привело к пустой строке.

Дополнительную информацию об этом поведении можно найти здесь. группа новостей comp.compilers

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top