Skip to content

Commit 2c4cb8d

Browse files
jensmaurerzygoloid
authored andcommitted
P1423R3 char8_t backward compatibility remediation
- omitted rationalizing comments in synopsis
1 parent b376d76 commit 2c4cb8d

File tree

4 files changed

+66
-7
lines changed

4 files changed

+66
-7
lines changed

source/compatibility.tex

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2240,14 +2240,33 @@
22402240
\rationale
22412241
Required for new features.
22422242
\effect
2243-
Valid ISO \CppXVII{} code that passes UTF-8 literals
2244-
to \tcode{basic_ostream::\brk{}operator<<}
2245-
no longer calls character-related overloads.
2243+
Valid ISO \CppXVII{} code that passes UTF-8 literals to
2244+
\tcode{basic_ostream<char, ...>::operator<<} or
2245+
\tcode{basic_ostream<wchar_t, ...>::operator<<} is now ill-formed.
22462246
\begin{codeblock}
22472247
std::cout << u8"text"; // previously called \tcode{operator<<(const char*)} and printed a string;
2248-
// now calls \tcode{operator<<(const void*)} and prints a pointer value
2248+
// now ill-formed
22492249
std::cout << u8'X'; // previously called \tcode{operator<<(char)} and printed a character;
2250-
// now calls \tcode{operator<<(int)} and prints an integer value
2250+
// now ill-formed
2251+
\end{codeblock}
2252+
2253+
\diffref{ostream.inserters.character}
2254+
\change
2255+
Overload resolution for ostream inserters
2256+
used with \tcode{wchar_t}, \tcode{char16_t}, or \tcode{char32_t} types.
2257+
\rationale
2258+
Removal of surprising behavior.
2259+
\effect
2260+
Valid ISO \CppXVII{} code that passes
2261+
\tcode{wchar_t}, \tcode{char16_t}, or \tcode{char32_t} characters or strings
2262+
to \tcode{basic_ostream<char, ...>::operator<<} or
2263+
that passes \tcode{char16_t} or \tcode{char32_t} characters or strings
2264+
to \tcode{basic_ostream<wchar_t, ...>::operator<<} is now ill-formed.
2265+
\begin{codeblock}
2266+
std::cout << u"text"; // previously formatted the string as a pointer value;
2267+
// now ill-formed
2268+
std::cout << u'X'; // previously formatted the character as an integer value;
2269+
// now ill-formed
22512270
\end{codeblock}
22522271

22532272
\diffref{fs.class.path}

source/future.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2418,7 +2418,7 @@
24182418
\pnum
24192419
\requires The \tcode{source} and \range{first}{last}
24202420
sequences are UTF-8 encoded. The value type of \tcode{Source}
2421-
and \tcode{InputIterator} is \tcode{char}.
2421+
and \tcode{InputIterator} is \tcode{char} or \tcode{char8_t}.
24222422
\tcode{Source} meets the requirements specified in \ref{fs.path.req}.
24232423

24242424
\pnum

source/iostreams.tex

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5829,6 +5829,24 @@
58295829
template<class traits>
58305830
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, unsigned char);
58315831

5832+
template<class traits>
5833+
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, wchar_t) = delete;
5834+
template<class traits>
5835+
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char8_t) = delete;
5836+
template<class traits>
5837+
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char16_t) = delete;
5838+
template<class traits>
5839+
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, char32_t) = delete;
5840+
template<class traits>
5841+
basic_ostream<wchar_t, traits>&
5842+
operator<<(basic_ostream<wchar_t, traits>&, char8_t) = delete;
5843+
template<class traits>
5844+
basic_ostream<wchar_t, traits>&
5845+
operator<<(basic_ostream<wchar_t, traits>&, char16_t) = delete;
5846+
template<class traits>
5847+
basic_ostream<wchar_t, traits>&
5848+
operator<<(basic_ostream<wchar_t, traits>&, char32_t) = delete;
5849+
58325850
template<class charT, class traits>
58335851
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&, const charT*);
58345852
template<class charT, class traits>
@@ -5840,6 +5858,28 @@
58405858
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const signed char*);
58415859
template<class traits>
58425860
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const unsigned char*);
5861+
5862+
template<class traits>
5863+
basic_ostream<char, traits>&
5864+
operator<<(basic_ostream<char, traits>&, const wchar_t*) = delete;
5865+
template<class traits>
5866+
basic_ostream<char, traits>&
5867+
operator<<(basic_ostream<char, traits>&, const char8_t*) = delete;
5868+
template<class traits>
5869+
basic_ostream<char, traits>&
5870+
operator<<(basic_ostream<char, traits>&, const char16_t*) = delete;
5871+
template<class traits>
5872+
basic_ostream<char, traits>&
5873+
operator<<(basic_ostream<char, traits>&, const char32_t*) = delete;
5874+
template<class traits>
5875+
basic_ostream<wchar_t, traits>&
5876+
operator<<(basic_ostream<wchar_t, traits>&, const char8_t*) = delete;
5877+
template<class traits>
5878+
basic_ostream<wchar_t, traits>&
5879+
operator<<(basic_ostream<wchar_t, traits>&, const char16_t*) = delete;
5880+
template<class traits>
5881+
basic_ostream<wchar_t, traits>&
5882+
operator<<(basic_ostream<wchar_t, traits>&, const char32_t*) = delete;
58435883
}
58445884
\end{codeblock}
58455885

source/support.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@
565565
\tcode{<functional>} \\ \rowsep
566566
\defnlibxname{cpp_lib_byte} & \tcode{201603L} &
567567
\tcode{<cstddef>} \\ \rowsep
568-
\defnlibxname{cpp_lib_char8_t} & \tcode{201811L} &
568+
\defnlibxname{cpp_lib_char8_t} & \tcode{201907L} &
569569
\tcode{<atomic>} \tcode{<filesystem>} \tcode{<istream>} \tcode{<limits>}
570570
\tcode{<locale>} \tcode{<ostream>} \tcode{<string>} \tcode{<string_view>}
571571
\\ \rowsep

0 commit comments

Comments
 (0)