On Tue, 10 Jun 2025 at 15:17, Giuseppe D'Angelo
<giuseppe.dang...@kdab.com> wrote:
>
> Hello,
>
> Thank you for the review.
>
> >> +#ifdef __cpp_lib_optional_range_support // >= C++26
> >> +      // Iterator support.
> >> +      constexpr iterator begin() noexcept
> >> +      {
> >> +    return iterator(
> >> +      this->_M_is_engaged() ? std::__addressof(this->_M_get()) : nullptr
> >
> > This can use std::addressof. I removed the indirection from addressof
> > to __addressof so there's no reason to prefer __addressof now, except
> > in code that needs to compile as C++98.
>
> Done. __addressof was used just a couple of lines below so that why I
> repeated it here.

We haven't replaced all the existing uses of __addressof (yet) but we
can stop adding more uses :-)

>
>
> >
> >> +    );
> >> +      }
> >> +
> >> +      constexpr const_iterator begin() const noexcept
> >> +      {
> >> +    return const_iterator(
> >> +      this->_M_is_engaged() ? std::__addressof(this->_M_get()) : nullptr
> >> +    );
> >> +      }
> >> +
> >> +      constexpr iterator end() noexcept
> >> +      {
> >> +    return begin() + has_value();
> >
> > I know this is precisely how end() is defined in the working draft,
> > but I'm wondering whether we want to make the implementation of
> > begin() and end() more similar. So either use has_value() in begin()
> > instead of this->_M_is_engaged(), or define end() as something like:
> >
> >       return iterator(this->_M_engaged()
> >           ? std::addressof(this->_M_get()) + 1, nullptr)
> >
> > No need to change it in your patch though, I don't have a preference
> > either way, and it could be changed later if somebody has compelling
> > rationale why one form is better than another.
>
> Yeah, that's exactly I wrote it in the first iteration, before realizing
> that end() is specified as code, so I changed it.
> I'm not sure which is best. Is there any such thing like warnings for
> using booleans with pointer arithmetic?

No, and it could easily be changed to (int)has_value() if needed.

> But as you say, I'll leave it
> alone for now, the two formulations are ABI compatible so it can be
> changed later if necessary.

Ack


> >
> > +  test(std::string("test"));
>
> Whops, I again added std::string to a constexpr test, so this will fail
> on the old ABI. Should I change it to e.g. std::vector, or should I keep
> it and add a `{ dg-require-effective-target cxx11_abi }` directive?


Would string_view work instead? If not, please change it to vector.

Reply via email to