Skip to content

P0487R1 Fixing operator>>(basic_istream&, CharT*) (LWG 2499) #2459

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions source/compatibility.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2079,6 +2079,19 @@

\rSec2[diff.cpp17.input.output]{\ref{input.output}: input/output library}

\diffref{istream.extractors}
\change
Character array extraction only takes array types.
\rationale Increase safety via preventing buffer overflow at compile time.
\effect
Valid \CppXVII{} code may fail to compile in this International Standard:
\begin{codeblock}
auto p = new char[100];
char q[100];
std::cin >> std::setw(20) >> p; // ill-formed; previously well-formed
std::cin >> std::setw(20) >> q; // OK
\end{codeblock}

\diffref{ostream.inserters.character}
\change
Overload resolution for ostream inserters used with UTF-8 literals.
Expand Down
33 changes: 14 additions & 19 deletions source/iostreams.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4270,12 +4270,12 @@
template<class traits>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char&);

template<class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT*);
template<class traits>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char*);
template<class traits>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char*);
template<class charT, class traits, size_t N>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT(&)[N]);
template<class traits, size_t N>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char(&)[N]);
template<class traits, size_t N>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char(&)[N]);
}
\end{codeblock}

Expand Down Expand Up @@ -4756,12 +4756,12 @@

\indexlibrarymember{operator>>}{basic_istream}%
\begin{itemdecl}
template<class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT* s);
template<class traits>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char* s);
template<class traits>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char* s);
template<class charT, class traits, size_t N>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT (&s)[N]);
template<class traits, size_t N>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char (&s)[N]);
template<class traits, size_t N>
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char (&s)[N]);
\end{itemdecl}

\begin{itemdescr}
Expand All @@ -4774,17 +4774,12 @@
object is constructed,
\tcode{operator>>}
extracts characters and stores them into
successive locations of an array whose first element is designated by
\tcode{s}.
If
\tcode{width()}
is greater than zero, \tcode{n} is
\tcode{width()}.
Otherwise \tcode{n} is the number of elements
of the largest array of
\tcode{char_type}
that can store a terminating
\tcode{charT()}.
\tcode{min(size_t(width()), N)}.
Otherwise \tcode{n} is \tcode{N}.
\tcode{n} is the maximum number of characters stored.

\pnum
Expand Down