[libcxx-commits] [PATCH] D121130: [libc++] Make common_iterator's proxy types into aggregates

Arthur O'Dwyer via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 7 10:46:39 PST 2022


Quuxplusone added inline comments.


================
Comment at: libcxx/include/__iterator/common_iterator.h:123
     } else {
-      return __proxy(*_VSTD::__unchecked_get<_Iter>(__hold_));
+      return __proxy{*_VSTD::__unchecked_get<_Iter>(__hold_)};
     }
----------------
ldionne wrote:
> Right, so we know that `_VSTD::__unchecked_get<_Iter>(__hold_)` (aka the iterator) has a non-reference `iter_reference_t`, which is a complicated way of saying `*iter` is a temporary. So when we construct the aggregate now, we're even eliding a move operation. That sounds right?
We're replacing a conversion `iter_reference_t&& -> iter_value_t` with a conversion `iter_reference_t -> iter_value_t`. In the case that `iter_reference_t` and `iter_value_t` are the //same// type, this is a savings. Otherwise, AIUI, it's really no different. (But I //imagine// that "they're the same type" is the common case.)

Also in the `__postfix_proxy` case, we're replacing `iter_reference_t&& -> iter_reference_t` with `iter_reference_t -> iter_reference_t`, which definitely saves one move-ctor of whatever type `iter_reference_t` is.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D121130/new/

https://reviews.llvm.org/D121130



More information about the libcxx-commits mailing list