#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 выглядит для меня лучше.