" Кодт " <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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.