Skip to content

Commit 0a2b47b

Browse files
authored
Merge 2018-11 LWG Motion 6
P0487R1 Fixing operator>>(basic_istream&, CharT*) (LWG 2499) Fixes #2412
2 parents ed6c309 + 6260a04 commit 0a2b47b

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

source/compatibility.tex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,6 +2079,19 @@
20792079

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

2082+
\diffref{istream.extractors}
2083+
\change
2084+
Character array extraction only takes array types.
2085+
\rationale Increase safety via preventing buffer overflow at compile time.
2086+
\effect
2087+
Valid \CppXVII{} code may fail to compile in this International Standard:
2088+
\begin{codeblock}
2089+
auto p = new char[100];
2090+
char q[100];
2091+
std::cin >> std::setw(20) >> p; // ill-formed; previously well-formed
2092+
std::cin >> std::setw(20) >> q; // OK
2093+
\end{codeblock}
2094+
20822095
\diffref{ostream.inserters.character}
20832096
\change
20842097
Overload resolution for ostream inserters used with UTF-8 literals.

source/iostreams.tex

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4270,12 +4270,12 @@
42704270
template<class traits>
42714271
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char&);
42724272

4273-
template<class charT, class traits>
4274-
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT*);
4275-
template<class traits>
4276-
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char*);
4277-
template<class traits>
4278-
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char*);
4273+
template<class charT, class traits, size_t N>
4274+
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT(&)[N]);
4275+
template<class traits, size_t N>
4276+
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, unsigned char(&)[N]);
4277+
template<class traits, size_t N>
4278+
basic_istream<char, traits>& operator>>(basic_istream<char, traits>&, signed char(&)[N]);
42794279
}
42804280
\end{codeblock}
42814281

@@ -4756,12 +4756,12 @@
47564756

47574757
\indexlibrarymember{operator>>}{basic_istream}%
47584758
\begin{itemdecl}
4759-
template<class charT, class traits>
4760-
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT* s);
4761-
template<class traits>
4762-
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char* s);
4763-
template<class traits>
4764-
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char* s);
4759+
template<class charT, class traits, size_t N>
4760+
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& in, charT (&s)[N]);
4761+
template<class traits, size_t N>
4762+
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, unsigned char (&s)[N]);
4763+
template<class traits, size_t N>
4764+
basic_istream<char, traits>& operator>>(basic_istream<char, traits>& in, signed char (&s)[N]);
47654765
\end{itemdecl}
47664766

47674767
\begin{itemdescr}
@@ -4774,17 +4774,12 @@
47744774
object is constructed,
47754775
\tcode{operator>>}
47764776
extracts characters and stores them into
4777-
successive locations of an array whose first element is designated by
47784777
\tcode{s}.
47794778
If
47804779
\tcode{width()}
47814780
is greater than zero, \tcode{n} is
4782-
\tcode{width()}.
4783-
Otherwise \tcode{n} is the number of elements
4784-
of the largest array of
4785-
\tcode{char_type}
4786-
that can store a terminating
4787-
\tcode{charT()}.
4781+
\tcode{min(size_t(width()), N)}.
4782+
Otherwise \tcode{n} is \tcode{N}.
47884783
\tcode{n} is the maximum number of characters stored.
47894784

47904785
\pnum

0 commit comments

Comments
 (0)