Использование копии (STL) с неопределенным поведением? - PullRequest
4 голосов
/ 31 марта 2019

В оценке я выбрал опцию ошибка времени выполнения в LINE I . Не было такой опции, как Неопределенное поведение , хотя я думал, что это будет правильный выбор.

Я не уверен, но считаю, что в оценке есть ошибка. Я скомпилировал и запустил программу, и она действительно печатает 3, 9, 0, 2, 1, 4, 5, с тремя разными компиляторами ( Cpp.sh , здесь и локально в Mac OS X).

Имеет ли программа неопределенное поведение из-за LINE I?

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void printer(int i) {
        cout << i << ", ";
}
int main() {
        int mynumbers[] = { 3, 9, 0, 2, 1, 4, 5 };
        vector<int> v1(mynumbers, mynumbers + 7);
        copy(mynumbers, mynumbers + 7, v1.end());//LINE I
        for_each(v1.begin(), v1.end(), printer);//LINE II
        return 0;
}

1 Ответ

7 голосов
/ 31 марта 2019

Да, это UB.

Первое, что сделает std::copy, это разыменование v1.end(), и вызовет неопределенное поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...