On Thu, 13 Nov 2025 at 15:15, Yuao Ma <[email protected]> wrote: > > On Wed, Nov 12, 2025 at 12:26 AM Jonathan Wakely <[email protected]> wrote: > > > > On Sun, 02 Nov 2025 at 15:45 +0800, Yuao Ma wrote: > > >Hi all, > > > > > >This patch implements paper P3223R2, which adds a new overload to > > >std::istream::ignore for char_type. > > >Since this function dates back to C++98, I've used type_traits from > > >the ext rather than the std header to maintain compatibility. > > > > > >Please take a look when you have time. > > > > I (along with other libstdc++ devs) was at the WG21 meeting for the > > past week and am still recovering from jetlag. > > > > >Thanks, > > >Yuao > > > > >From 80f609ffb64c4aba74df13c97f99ad72c2abf1bb Mon Sep 17 00:00:00 2001 > > >From: Yuao Ma <[email protected]> > > >Date: Sun, 2 Nov 2025 15:39:38 +0800 > > >Subject: [PATCH] libstdc++: Implement P3223R2 Making std::istream::ignore > > >less > > > surprising > > > > > >libstdc++-v3/ChangeLog: > > > > > > * include/std/istream: Add a overload for char_type. > > > * testsuite/27_io/basic_istream/ignore/char/4.cc: New test. > > >--- > > > libstdc++-v3/include/std/istream | 8 +++++- > > > .../27_io/basic_istream/ignore/char/4.cc | 25 +++++++++++++++++++ > > > 2 files changed, 32 insertions(+), 1 deletion(-) > > > create mode 100644 > > > libstdc++-v3/testsuite/27_io/basic_istream/ignore/char/4.cc > > > > > >diff --git a/libstdc++-v3/include/std/istream > > >b/libstdc++-v3/include/std/istream > > >index d5bb1876001..8a392782d68 100644 > > >--- a/libstdc++-v3/include/std/istream > > >+++ b/libstdc++-v3/include/std/istream > > >@@ -38,6 +38,7 @@ > > > #endif > > > > > > #include <bits/requires_hosted.h> // iostreams > > >+#include <ext/type_traits.h> // __enable_if > > > > > > #include <ios> > > > #include <ostream> > > >@@ -537,11 +538,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > * is extracted); note that this condition will never occur if > > > * @a __delim equals @c traits::eof(). > > > * > > >- * NB: Provide three overloads, instead of the single function > > >+ * NB: Provide four overloads, instead of the single function > > > * (with defaults) mandated by the Standard: this leads to a > > > * better performing implementation, while still conforming to > > > * the Standard. > > > */ > > >+ template<typename _Tp> > > >+ typename __gnu_cxx::__enable_if<__are_same<_Tp, char>::__value, > > >__istream_type&>::__type > > > > This seems to add std::wistream::ignore(streamsize, char) which is not > > what the paper says. > > > > The new ignore should only be present for basic_istream<char, traits> > > and not other specializations. The Constraints: element means the > > function is only present for the char specializations, it doesn't > > mean that the overload is only enabled when the second argument is > > char. > > > > I was intending something like: > > > > #if __cplusplus > 202302L > > basic_istream& > > ignore(streamsize __n, char __delim) requires same_as<_CharT, char> > > #else > > template<typename _Tp = _CharT> > > typename > > __gnu_cxx::__enable_if<__are_same<_Tp, char>::__value, > > basic_istream&>::__type > > #endif > > > > Default template parameters were introduced in C++11, so we may need a > separate preprocessor branch for C++98/03.
I think the change should simply not be backported and should be C++26 only, at least initially. Maybe we can decide to make it a DR for older standards later. > And I'm a bit confused here. Why does adding `_Tp = _CharT` prevent > the overload from appearing for wstream? I'm not sure what I'm > missing. Oops, my suggestion was missing this line before the #endif ignore(streamsize __n, char __delim) i.e. the __delim should be char, not a deduced _Tp type. And so the __enable_if constraint is checking __are_same<_CharT, char> which is not the same as your original, which was checking that decltype(__delim) is char. The difference is that my suggestion would only enable the function for std::basic_istream<char, Tr> and not std::basic_istream<wchar_t, Tr>. But please just make it a C++26 change anyway, and then we can just use requires same_as<_CharT, char> which is exactly the constraint proposed in P3223R2.
