checked ostream_iterator
От: Centaur Россия  
Дата: 28.05.10 13:35
Оценка:
#include <ostream>
#include <fstream>
#include <iterator>

int main()
{
    std::ofstream ofs;
    int const ints[] = { 3, 14, 16 };
    std::copy(ints, ints + 3, std::ostream_iterator<int>(ofs, " "));
}


Ожидаемое поведение:
Наблюдаемое поведение (Visual C++ 2008):

Спрашивается: вроде бы я неопределённого поведения не вызывал; так какого…?

(Аналогичные грабли при попытке взять &v[0] при пустом std::vector<T> v. Неопределённого поведения нет, но Microsoft, собака, бдит.)
Re: checked ostream_iterator
От: Acteon  
Дата: 28.05.10 13:42
Оценка:
По мнению MS это защит нас от ошибок. Они заботятся о простых программистах.
Re: checked ostream_iterator
От: Sni4ok  
Дата: 28.05.10 14:57
Оценка: -1
Здравствуйте, Centaur, Вы писали:

C>(Аналогичные грабли при попытке взять &v[0] при пустом std::vector<T> v. Неопределённого поведения нет, но Microsoft, собака, бдит.)


как раз есть, нельзя вызывать begin() у пустого контейнера, например тут может падать.
Re[2]: checked ostream_iterator
От: Centaur Россия  
Дата: 28.05.10 16:59
Оценка:
Здравствуйте, Sni4ok, Вы писали:

C>>(Аналогичные грабли при попытке взять &v[0] при пустом std::vector<T> v. Неопределённого поведения нет, но Microsoft, собака, бдит.)


S>как раз есть, нельзя вызывать begin() у пустого контейнера, например тут может падать.


То есть как это foreach(v.begin(), v.end(), f) нельзя? Где написано?

И foreach(&v[0], &v[v.size()], f) тоже должно быть можно, по правилу о том, что можно брать указатель/итератор за последним элементом, постольку, поскольку мы не пытаемся его разыменовывать.

Но вот нет, блин, валидация делается сразу при взятии элемента по индексу.
Re[3]: checked ostream_iterator
От: Vain Россия google.ru
Дата: 28.05.10 18:07
Оценка:
Здравствуйте, Centaur, Вы писали:

C>>>(Аналогичные грабли при попытке взять &v[0] при пустом std::vector<T> v. Неопределённого поведения нет, но Microsoft, собака, бдит.)

S>>как раз есть, нельзя вызывать begin() у пустого контейнера, например тут может падать.
C>То есть как это foreach(v.begin(), v.end(), f) нельзя? Где написано?
C>И foreach(&v[0], &v[v.size()], f) тоже должно быть можно, по правилу о том, что можно брать указатель/итератор за последним элементом, постольку, поскольку мы не пытаемся его разыменовывать.
C>Но вот нет, блин, валидация делается сразу при взятии элемента по индексу.
Вам это сильно мешает?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: checked ostream_iterator
От: Sni4ok  
Дата: 28.05.10 22:41
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Centaur, Вы писали:


C>>(Аналогичные грабли при попытке взять &v[0] при пустом std::vector<T> v. Неопределённого поведения нет, но Microsoft, собака, бдит.)


S>как раз есть, нельзя вызывать begin() у пустого контейнера, например тут может падать.


конечно я тут неправ, я хотел сказать нельзя разиминовывать нулевой элемент, если его не существует
Re[3]: checked ostream_iterator
От: Sni4ok  
Дата: 28.05.10 22:44
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, Sni4ok, Вы писали:


C>То есть как это foreach(v.begin(), v.end(), f) нельзя? Где написано?


так можно

C>И foreach(&v[0], &v[v.size()], f) тоже должно быть можно, по правилу о том, что можно брать указатель/итератор за последним элементом, постольку, поскольку мы не пытаемся его разыменовывать.


так нельзя- &v[0] это есть разименование.

C>Но вот нет, блин, валидация делается сразу при взятии элемента по индексу.


любой дебажный stl вам сообщит об ошибке- нетолько студия, но и stlport к примеру.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.