Skip to content

Commit 59fb95a

Browse files
committed
P1165R1 Make stateful allocator propagation more consistent for operator+(basic_string)
1 parent 12935b8 commit 59fb95a

File tree

1 file changed

+71
-78
lines changed

1 file changed

+71
-78
lines changed

source/strings.tex

Lines changed: 71 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -3919,12 +3919,20 @@
39193919
basic_string<charT, traits, Allocator>
39203920
operator+(const basic_string<charT, traits, Allocator>& lhs,
39213921
const basic_string<charT, traits, Allocator>& rhs);
3922+
template<class charT, class traits, class Allocator>
3923+
basic_string<charT, traits, Allocator>
3924+
operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
39223925
\end{itemdecl}
39233926

39243927
\begin{itemdescr}
39253928
\pnum
3926-
\returns
3927-
\tcode{basic_string<charT, traits, Allocator>(lhs).append(rhs)}.
3929+
\effects
3930+
Equivalent to:
3931+
\begin{codeblock}
3932+
basic_string<charT, traits, Allocator> r = lhs;
3933+
r.append(rhs);
3934+
return r;
3935+
\end{codeblock}
39283936
\end{itemdescr}
39293937

39303938
\indexlibrarymember{operator+}{basic_string}%
@@ -3933,26 +3941,19 @@
39333941
basic_string<charT, traits, Allocator>
39343942
operator+(basic_string<charT, traits, Allocator>&& lhs,
39353943
const basic_string<charT, traits, Allocator>& rhs);
3936-
\end{itemdecl}
3937-
3938-
\begin{itemdescr}
3939-
\pnum
3940-
\returns
3941-
\tcode{std::move(lhs.append(rhs))}.
3942-
\end{itemdescr}
3943-
3944-
\indexlibrarymember{operator+}{basic_string}%
3945-
\begin{itemdecl}
39463944
template<class charT, class traits, class Allocator>
39473945
basic_string<charT, traits, Allocator>
3948-
operator+(const basic_string<charT, traits, Allocator>& lhs,
3949-
basic_string<charT, traits, Allocator>&& rhs);
3946+
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
39503947
\end{itemdecl}
39513948

39523949
\begin{itemdescr}
39533950
\pnum
3954-
\returns
3955-
\tcode{std::move(rhs.insert(0, lhs))}.
3951+
\effects
3952+
Equivalent to:
3953+
\begin{codeblock}
3954+
lhs.append(rhs);
3955+
return std::move(lhs);
3956+
\end{codeblock}
39563957
\end{itemdescr}
39573958

39583959
\indexlibrarymember{operator+}{basic_string}%
@@ -3965,109 +3966,92 @@
39653966

39663967
\begin{itemdescr}
39673968
\pnum
3968-
\returns
3969-
\tcode{std::move(lhs.append(rhs))}.
3969+
\effects
3970+
Equivalent to:
3971+
\begin{codeblock}
3972+
lhs.append(rhs);
3973+
return std::move(lhs);
3974+
\end{codeblock}
3975+
except that both \tcode{lhs} and \tcode{rhs}
3976+
are left in valid but unspecified states.
39703977
\begin{note}
3971-
Or equivalently, \tcode{std::move(rhs.insert(0, lhs))}.
3978+
If \tcode{lhs} and \tcode{rhs} have equal allocators,
3979+
the implementation may move from either.
39723980
\end{note}
39733981
\end{itemdescr}
39743982

39753983
\indexlibrarymember{operator+}{basic_string}%
39763984
\begin{itemdecl}
39773985
template<class charT, class traits, class Allocator>
39783986
basic_string<charT, traits, Allocator>
3979-
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
3980-
\end{itemdecl}
3981-
3982-
\begin{itemdescr}
3983-
\pnum
3984-
\returns
3985-
\tcode{basic_string<charT, traits, Allocator>(lhs) + rhs}.
3986-
3987-
\pnum
3988-
\remarks
3989-
Uses
3990-
\tcode{traits::length()}.
3991-
\end{itemdescr}
3992-
3993-
\indexlibrarymember{operator+}{basic_string}%
3994-
\begin{itemdecl}
3987+
operator+(const basic_string<charT, traits, Allocator>& lhs,
3988+
basic_string<charT, traits, Allocator>&& rhs);
39953989
template<class charT, class traits, class Allocator>
39963990
basic_string<charT, traits, Allocator>
39973991
operator+(const charT* lhs, basic_string<charT, traits, Allocator>&& rhs);
39983992
\end{itemdecl}
39993993

40003994
\begin{itemdescr}
40013995
\pnum
4002-
\returns
4003-
\tcode{std::move(rhs.insert(0, lhs))}.
4004-
4005-
\pnum
4006-
\remarks
4007-
Uses
4008-
\tcode{traits::length()}.
4009-
\end{itemdescr}
4010-
4011-
\indexlibrarymember{operator+}{basic_string}%
4012-
\begin{itemdecl}
4013-
template<class charT, class traits, class Allocator>
4014-
basic_string<charT, traits, Allocator>
4015-
operator+(charT lhs, const basic_string<charT, traits, Allocator>& rhs);
4016-
\end{itemdecl}
4017-
4018-
\begin{itemdescr}
4019-
\pnum
4020-
\returns
4021-
\tcode{basic_string<charT, traits, Allocator>(1, lhs) + rhs}.
3996+
\effects
3997+
Equivalent to:
3998+
\begin{codeblock}
3999+
rhs.insert(0, lhs);
4000+
return std::move(rhs);
4001+
\end{codeblock}
40224002
\end{itemdescr}
40234003

40244004
\indexlibrarymember{operator+}{basic_string}%
40254005
\begin{itemdecl}
40264006
template<class charT, class traits, class Allocator>
40274007
basic_string<charT, traits, Allocator>
4028-
operator+(charT lhs, basic_string<charT, traits, Allocator>&& rhs);
4008+
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
40294009
\end{itemdecl}
40304010

40314011
\begin{itemdescr}
40324012
\pnum
4033-
\returns
4034-
\tcode{std::move(rhs.insert(0, 1, lhs))}.
4013+
\effects
4014+
Equivalent to:
4015+
\begin{codeblock}
4016+
basic_string<charT, traits, Allocator> r = rhs;
4017+
r.insert(0, lhs);
4018+
return r;
4019+
\end{codeblock}
40354020
\end{itemdescr}
40364021

40374022
\indexlibrarymember{operator+}{basic_string}%
40384023
\begin{itemdecl}
40394024
template<class charT, class traits, class Allocator>
40404025
basic_string<charT, traits, Allocator>
4041-
operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
4026+
operator+(charT lhs, const basic_string<charT, traits, Allocator>& rhs);
40424027
\end{itemdecl}
40434028

40444029
\begin{itemdescr}
40454030
\pnum
4046-
\returns
4047-
\tcode{lhs + basic_string<charT, traits, Allocator>(rhs)}.
4048-
4049-
\pnum
4050-
\remarks
4051-
Uses
4052-
\tcode{traits::length()}.
4031+
\effects
4032+
Equivalent to:
4033+
\begin{codeblock}
4034+
basic_string<charT, traits, Allocator> r = rhs;
4035+
r.insert(r.begin(), lhs);
4036+
return r;
4037+
\end{codeblock}
40534038
\end{itemdescr}
40544039

40554040
\indexlibrarymember{operator+}{basic_string}%
40564041
\begin{itemdecl}
40574042
template<class charT, class traits, class Allocator>
40584043
basic_string<charT, traits, Allocator>
4059-
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
4044+
operator+(charT lhs, basic_string<charT, traits, Allocator>&& rhs);
40604045
\end{itemdecl}
40614046

40624047
\begin{itemdescr}
40634048
\pnum
4064-
\returns
4065-
\tcode{std::move(lhs.append(rhs))}.
4066-
4067-
\pnum
4068-
\remarks
4069-
Uses
4070-
\tcode{traits::length()}.
4049+
\effects
4050+
Equivalent to:
4051+
\begin{codeblock}
4052+
rhs.insert(rhs.begin(), lhs);
4053+
return std::move(rhs);
4054+
\end{codeblock}
40714055
\end{itemdescr}
40724056

40734057
\indexlibrarymember{operator+}{basic_string}%
@@ -4079,8 +4063,13 @@
40794063

40804064
\begin{itemdescr}
40814065
\pnum
4082-
\returns
4083-
\tcode{lhs + basic_string<charT, traits, Allocator>(1, rhs)}.
4066+
\effects
4067+
Equivalent to:
4068+
\begin{codeblock}
4069+
basic_string<charT, traits, Allocator> r = lhs;
4070+
r.push_back(rhs);
4071+
return r;
4072+
\end{codeblock}
40844073
\end{itemdescr}
40854074

40864075
\indexlibrarymember{operator+}{basic_string}%
@@ -4092,8 +4081,12 @@
40924081

40934082
\begin{itemdescr}
40944083
\pnum
4095-
\returns
4096-
\tcode{std::move(lhs.append(1, rhs))}.
4084+
\effects
4085+
Equivalent to:
4086+
\begin{codeblock}
4087+
lhs.push_back(rhs);
4088+
return std::move(lhs);
4089+
\end{codeblock}
40974090
\end{itemdescr}
40984091

40994092
\rSec3[string.operator==]{\tcode{operator==}}

0 commit comments

Comments
 (0)