https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116549
Bug ID: 116549
Summary: std::disable_sized_sentinel_for is missing
specialisation for std::move_iterator
Product: gcc
Version: 14.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: daidodo at gmail dot com
Target Milestone: ---
Hi, the following code fail to compile:
```
// std=c++23
#include <iterator>
int main() {
static_assert(not std::sized_sentinel_for<int*, int**>);
using S = std::move_iterator<int*>;
using I = std::move_iterator<int**>;
static_assert(true == std::disable_sized_sentinel_for<S, I>); // error
}
```
When S is not a sized sentinel of I, we should not make std::move_iterator<S> a
sized sentinel for std::move_iterator<I>.
According to cppreference
(https://en.cppreference.com/w/cpp/iterator/move_iterator), there should be a
specialisation of std::disable_sized_sentinel_for:
```
template< class Iterator1, class Iterator2 >
requires (!std::sized_sentinel_for<Iterator1, Iterator2>)
constexpr bool disable_sized_sentinel_for<
std::move_iterator<Iterator1>,
std::move_iterator<Iterator2>> = true;
```
But I couldn't find it in any of the current GCC source, especially
*libstdc++-v3/include/bits/stl_iterator.h* where std::move_iterator is defined.
Please confirm if it's a miss?
Thanks,
Zhao