[PATCH] D25124: Support rvalue references in enumerate range adapter.

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 1 20:08:38 PDT 2016


chandlerc added inline comments.


> STLExtras.h:641
>    struct iterator {
> -    iterator(I Iter, std::size_t Index) : Iter(Iter), Index(Index) {}
> -
> -    result_pair<const V> operator*() const {
> -      return result_pair<const V>(Index, *Iter);
> +  public:
> +    // std::declval<R>() will return an R&&, which causes std::begin() to return

No need for public? This is a struct...

> STLExtras.h:642-646
> +    // std::declval<R>() will return an R&&, which causes std::begin() to return
> +    // a const_iterator.  Since the storage for the underlying range is an
> +    // lvalue, enforce this with std::declval<R&>().
> +    using I = decltype(std::begin(std::declval<R &>()));
> +    using V = typename std::remove_const<decltype(*std::declval<I>())>::type;

I don't really understand this comment or the remove_const below...

For example, does the remove_const cause this to allow mutation even when the range itself doesn't? That doesn't seem good...

(also, 80 columns)

> STLExtras.h:651-653
> +    // result_pair<const V> operator*() const {
> +    //  return result_pair<const V>(Index, *Iter);
> +    //}

?

https://reviews.llvm.org/D25124





More information about the llvm-commits mailing list