Re[3]: Наследование std::ostream и форматирование вывода
От: Sergey Россия  
Дата: 26.03.09 14:41
Оценка: 60 (1)
" Кодт " <4783@users.rsdn.ru> wrote in message news:3343315@news.rsdn.ru...
> Здравствуйте, Sergey, Вы писали:
>
> S>Тут вопрос — какой уровень автоматизма требуется. Если устраивает что-то вроде
> S>
> S>ident i;
> S>s << i << quoted("level 0") << endl
> S>  << i << quoted("level 0 again") << endl
> S>  << ++i << quoted("level 1") << endl
> S>  << --i << quoted("level 0") << endl;
> S>

>
> unspecified behavior или просто бред.
> Потому что порядок выполнения автоинкремента, автодекремента и обоих просто подстановок — в данном выражении не определён.
>
> Если компилятор не захочет срезать углы и проинлайнить, то получим отступы 0,0,0,-1 (при передаче ident в operator<< по значению) или 0,0,0,0 (по ссылке).
> А если срежет и проинлайнит — получим лотерею.

Да ну. Реально ident устроен так (далее он называется indent_t):

 struct indent_t
 {
  struct incr
  {
   indent_t& src_;
   explicit incr(indent_t& src) : src_(src) {}
  };
  struct decr
  {
   indent_t& src_;
   explicit decr(indent_t& src) : src_(src) {}
  };
  int n_;
  explicit indent_t(int n = 1) : n_(n) {}
  incr operator++()
  { return incr(*this); }
  decr operator--()
  { return decr(*this); }
  indent_t operator+(int x) const
  { return indent_t(n_ + x); }
  indent_t operator-(int x) const
  { return indent_t(n_ - x); }
 };
 inline std::ostream& operator<<(std::ostream& os, indent_t const& v)
 {
  assert(v.n_ >= 0);
  for (int n = v.n_; n != 0; --n)
   os << "  ";
  return os;
 }
 inline std::ostream& operator<<(std::ostream& os, indent_t::incr v)
 {
  ++v.src_.n_;
  return os << v.src_;
 }
 inline std::ostream& operator<<(std::ostream& os, indent_t::decr v)
 {
  --v.src_.n_;
  return os << v.src_;
 }


В каком конкретно месте тут unspecified?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.