Как я понимаю, инструкция &arr[N] используется только на чтение для определения дошел
ли итератор for_each до конца массива. Но фактически это обращение за пределы массива
и даже попытка чтения адреса может вызвать access violation.
На VC++7.1 все нормально выполняется.
Посоветуйте, насколько корректна такая форма вызова и не ли тут каких-нибудь тонких моментов?
G>Как я понимаю, инструкция &arr[N] используется только на чтение для определения дошел G>ли итератор for_each до конца массива. Но фактически это обращение за пределы массива G>и даже попытка чтения адреса может вызвать access violation.
&arr[N] равнозначно (arr + N) -- если тебя смущет первый вариант записи, то используй второй.
Операции "чтения адреса" в природе не существует (не путать с чтением значения указателя из памяти).
G>std::for_each(&arr[0],&arr[N],boost::mem_fn(&CType::Func,boost::ref(_1));
G>Как я понимаю, инструкция &arr[N] используется только на чтение для определения дошел G>ли итератор for_each до конца массива. Но фактически это обращение за пределы массива G>и даже попытка чтения адреса может вызвать access violation.
Итератор end() (конца списка) устанавливается в позицию, следующую за последним элементом. То есть тут все верно. А в for_each будет код наподобие:
for (iter = begin_iter; iter != end_iter; iter++)
....
}
То есть никаких попыток чтения данных за пределами массива не будет.
Здравствуйте, Gigachel, Вы писали:
G>Как я понимаю, инструкция &arr[N] используется только на чтение для определения дошел G>ли итератор for_each до конца массива. Но фактически это обращение за пределы массива G>и даже попытка чтения адреса может вызвать access violation.
Правильно, поэтому следует использовать такую запись:
Здравствуйте, sch, Вы писали:
sch>&arr[N] равнозначно (arr + N) -- если тебя смущет первый вариант записи, то используй второй.
Нет — &arr[N] равнозначно такому выражению: &*(arr+N).
Здравствуйте, Gigachel, Вы писали:
G>CType arr[N];
G>std::for_each(&arr[0],&arr[N],boost::mem_fn(&CType::Func,boost::ref(_1));
G>Посоветуйте, насколько корректна такая форма вызова и не ли тут каких-нибудь тонких моментов?
Да, формально в C++ &arr[N] — неопределенное поведение (в C эта конструкция корректна).
Кстати, boost предоставляет обертку над массивом boost::array, которая позволяет работать со встроенным массивом теми же средствами, что и со стандартным контейнером.