From ca333c7611bdfd7c92e8ce9b97bac0790d74f104 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sat, 21 Jun 2025 18:16:43 +0100 Subject: [PATCH] P3223R2 Making std::istream::ignore less surprising --- source/compatibility.tex | 22 ++++++++++++++++++++++ source/iostreams.tex | 16 ++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/source/compatibility.tex b/source/compatibility.tex index 87878a3075..9e879198a9 100644 --- a/source/compatibility.tex +++ b/source/compatibility.tex @@ -285,6 +285,28 @@ \end{codeblock} \end{example} +\rSec2[diff.cpp23.io]{\ref{input.output}: input/output library} + +\diffref{istream.unformatted} +\change +Overloaded \tcode{std::basic_istream::ignore}. +\rationale +Allow \tcode{char} values to be used as delimiters. +\effect +Calls to \tcode{istream::ignore} with a second argument of \tcode{char} type +can change behavior. +Calls to \tcode{istream::ignore} with a second argument that is neither +\tcode{int} nor \tcode{char} type can become ill-formed. +\begin{example} +\begin{codeblock} +std::istringstream in("\xF0\x9F\xA4\xA1 Clown Face"); +in.ignore(100, '\xA1'); // ignore up to \tcode{'\textbackslash{}xA1'} delimiter, + // previously might have ignored to EOF +in.ignore(100, -1L); // ambiguous overload, + // previously equivalent to \tcode{(int)-1L} +\end{codeblock} +\end{example} + \rSec2[diff.cpp23.depr]{\ref{depr}: compatibility features} \nodiffref diff --git a/source/iostreams.tex b/source/iostreams.tex index 638dc8bfd8..c23954cd13 100644 --- a/source/iostreams.tex +++ b/source/iostreams.tex @@ -4363,6 +4363,7 @@ basic_istream& getline(char_type* s, streamsize n, char_type delim); basic_istream& ignore(streamsize n = 1, int_type delim = traits::eof()); + basic_istream& ignore(streamsize n, char_type delim); int_type peek(); basic_istream& read (char_type* s, streamsize n); streamsize readsome(char_type* s, streamsize n); @@ -5426,6 +5427,21 @@ \tcode{*this}. \end{itemdescr} +\indexlibrarymember{ignore}{basic_istream}% +\begin{itemdecl} +basic_istream& ignore(streamsize n, char_type delim); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\constraints +\tcode{is_same_v} is \tcode{true}. + +\pnum +\effects +Equivalent to: \tcode{return ignore(n, traits::to_int_type(delim));} +\end{itemdescr} + \indexlibrarymember{peek}{basic_istream}% \begin{itemdecl} int_type peek();