Использование копии (STL) с неопределенным поведением?

#c #stl

#c #stl

Вопрос:

При оценке я выбрал опцию ошибка времени выполнения в СТРОКЕ I. Не было такого варианта, как неопределенное поведение, хотя я подумал, что это было бы правильным выбором.

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

Имеет ли программа неопределенное поведение из-за СТРОКИ 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:

Да, это UB.

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

Комментарии:

1. Можно ли считать неопределенное поведение частным случаем ошибки времени выполнения ? Если это так, текст назначения был правильным, не так ли?

2. @ElProfesor Я бы не назвал это ошибкой времени выполнения. UB может дать вам любой эффект, включая отсутствие ошибок вообще (что и произошло с OP). И поскольку UB в коде OP происходит безоговорочно, я полагаю, что это может даже вызвать ошибку времени компиляции.

3. Спасибо. Итак, вы думаете, что формулировка должна быть такой это неопределенное поведение, и поэтому оно может привести к ошибке во время выполнения ? Так лучше?

4. @ElProfesor выглядит для меня лучше.