On Mon, 4 Nov 2024 at 18:30, François Dumont <frs.dum...@gmail.com> wrote: > > > On 21/10/2024 06:56, François Dumont wrote: > > > On 17/10/2024 23:11, Jonathan Wakely wrote: > > > > On Thu, 17 Oct 2024 at 21:39, Jonathan Wakely <jwakely....@gmail.com> wrote: >> >> >> >> On Thu, 17 Oct 2024 at 20:52, François Dumont <frs.dum...@gmail.com> wrote: >>> >>> Here is an updated version that compiles, I think, all your feedbacks. It's >>> much cleaner indeed. >> >> >> Thanks, I'll take a look tomorrow. >> >>> >>> It's also tested in C++98/17/23. >>> >>> I'm surprised that we do not need to consider potential >>> allocator::const_pointer. >> >> Do you mean consider the case where Alloc::const_pointer is not the same >> type as rebinding 'pointer' to a const element type? > > Yes, exactly. > > >> >> We don't need to consider that because we never get a 'const_pointer' from >> the allocator, and we never need to pass a 'const_pointer' to the allocator. >> The allocator's 'allocate' and 'deallocate' members both work with the >> 'pointer' type, so we only need to use that type when interacting with the >> allocator. For all the other uses, such as _Const_Node_ptr, what we need is >> a pointer-to-const that's compatible with the allocator's pointer type. It >> doesn't actually matter if it's the same type as >> allocator_traits<Alloc>::const_pointer, because we don't need > > > Sorry, I sent the email before finishing that thought! > > ... we don't need to pass a const_pointer to anything, we only need it for > the container's own purposes. > > But thinking about it some more, do we even need a const-pointer for the > container? Currently the const_iterator stores a const-pointer, and some > members like _M_root() and _M_leftmost() return a const-pointer. But they > don't need to. The nodes are all pointed to by a non-const _Base_ptr, none of > the storage managed by the container is const. > > Except _M_impl._M_header in a const context. > > Using const_cast would result in a similar UB that you fixed on > _GLIBCXX_DEBUG containers, no ?
We only use a pointer to _M_header for the past-the-end iterator, which is not dereferenceable. It's OK to do the const_cast, it's not OK to write something through that pointer/reference if the object is really const. But you can't write through a past-the-end pointer anyway. > > I can provide a version with the const_cast but I'm not sure it worth it. > > François > >