Skip to content

Commit 6348591

Browse files
committed
P1165R1 Make stateful allocator propagation more consistent for operator+(basic_string)
1 parent 8ce07ea commit 6348591

File tree

1 file changed

+73
-77
lines changed

1 file changed

+73
-77
lines changed

source/strings.tex

Lines changed: 73 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3143,12 +3143,20 @@
31433143
basic_string<charT, traits, Allocator>
31443144
operator+(const basic_string<charT, traits, Allocator>& lhs,
31453145
const basic_string<charT, traits, Allocator>& rhs);
3146+
template<class charT, class traits, class Allocator>
3147+
basic_string<charT, traits, Allocator>
3148+
operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
31463149
\end{itemdecl}
31473150

31483151
\begin{itemdescr}
31493152
\pnum
3150-
\returns
3151-
\tcode{std::move(basic_string<charT, traits, Allocator>(lhs).append(rhs))}.
3153+
\effects
3154+
Equivalent to:
3155+
\begin{codeblock}
3156+
basic_string<charT, traits, Allocator> r = lhs;
3157+
r.append(rhs);
3158+
return r;
3159+
\end{codeblock}
31523160
\end{itemdescr}
31533161

31543162
\indexlibrarymember{operator+}{basic_string}%
@@ -3157,26 +3165,19 @@
31573165
basic_string<charT, traits, Allocator>
31583166
operator+(basic_string<charT, traits, Allocator>&& lhs,
31593167
const basic_string<charT, traits, Allocator>& rhs);
3160-
\end{itemdecl}
3161-
3162-
\begin{itemdescr}
3163-
\pnum
3164-
\returns
3165-
\tcode{std::move(lhs.append(rhs))}.
3166-
\end{itemdescr}
3167-
3168-
\indexlibrarymember{operator+}{basic_string}%
3169-
\begin{itemdecl}
31703168
template<class charT, class traits, class Allocator>
31713169
basic_string<charT, traits, Allocator>
3172-
operator+(const basic_string<charT, traits, Allocator>& lhs,
3173-
basic_string<charT, traits, Allocator>&& rhs);
3170+
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
31743171
\end{itemdecl}
31753172

31763173
\begin{itemdescr}
31773174
\pnum
3178-
\returns
3179-
\tcode{std::move(rhs.insert(0, lhs))}.
3175+
\effects
3176+
Equivalent to:
3177+
\begin{codeblock}
3178+
lhs.append(rhs);
3179+
return std::move(lhs);
3180+
\end{codeblock}
31803181
\end{itemdescr}
31813182

31823183
\indexlibrarymember{operator+}{basic_string}%
@@ -3189,106 +3190,92 @@
31893190

31903191
\begin{itemdescr}
31913192
\pnum
3192-
\returns
3193-
\tcode{std::move(lhs.append(rhs))}.
3193+
\effects
3194+
Equivalent to:
3195+
\begin{codeblock}
3196+
lhs.append(rhs);
3197+
return std::move(lhs);
3198+
\end{codeblock}
3199+
except that both \tcode{lhs} and \tcode{rhs}
3200+
are left in valid but unspecified states.
3201+
\begin{note}
3202+
If \tcode{lhs} and \tcode{rhs} have equal allocators,
3203+
the implementation may move from either.
3204+
\end{note}
31943205
\end{itemdescr}
31953206

31963207
\indexlibrarymember{operator+}{basic_string}%
31973208
\begin{itemdecl}
31983209
template<class charT, class traits, class Allocator>
31993210
basic_string<charT, traits, Allocator>
3200-
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
3201-
\end{itemdecl}
3202-
3203-
\begin{itemdescr}
3204-
\pnum
3205-
\returns
3206-
\tcode{basic_string<charT, traits, Allocator>(lhs) + rhs}.
3207-
3208-
\pnum
3209-
\remarks
3210-
Uses
3211-
\tcode{traits::length()}.
3212-
\end{itemdescr}
3213-
3214-
\indexlibrarymember{operator+}{basic_string}%
3215-
\begin{itemdecl}
3211+
operator+(const basic_string<charT, traits, Allocator>& lhs,
3212+
basic_string<charT, traits, Allocator>&& rhs);
32163213
template<class charT, class traits, class Allocator>
32173214
basic_string<charT, traits, Allocator>
32183215
operator+(const charT* lhs, basic_string<charT, traits, Allocator>&& rhs);
32193216
\end{itemdecl}
32203217

32213218
\begin{itemdescr}
32223219
\pnum
3223-
\returns
3224-
\tcode{std::move(rhs.insert(0, lhs))}.
3225-
3226-
\pnum
3227-
\remarks
3228-
Uses
3229-
\tcode{traits::length()}.
3230-
\end{itemdescr}
3231-
3232-
\indexlibrarymember{operator+}{basic_string}%
3233-
\begin{itemdecl}
3234-
template<class charT, class traits, class Allocator>
3235-
basic_string<charT, traits, Allocator>
3236-
operator+(charT lhs, const basic_string<charT, traits, Allocator>& rhs);
3237-
\end{itemdecl}
3238-
3239-
\begin{itemdescr}
3240-
\pnum
3241-
\returns
3242-
\tcode{basic_string<charT, traits, Allocator>(1, lhs) + rhs}.
3220+
\effects
3221+
Equivalent to:
3222+
\begin{codeblock}
3223+
rhs.insert(0, lhs);
3224+
return std::move(rhs);
3225+
\end{codeblock}
32433226
\end{itemdescr}
32443227

32453228
\indexlibrarymember{operator+}{basic_string}%
32463229
\begin{itemdecl}
32473230
template<class charT, class traits, class Allocator>
32483231
basic_string<charT, traits, Allocator>
3249-
operator+(charT lhs, basic_string<charT, traits, Allocator>&& rhs);
3232+
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);
32503233
\end{itemdecl}
32513234

32523235
\begin{itemdescr}
32533236
\pnum
3254-
\returns
3255-
\tcode{std::move(rhs.insert(0, 1, lhs))}.
3237+
\effects
3238+
Equivalent to:
3239+
\begin{codeblock}
3240+
basic_string<charT, traits, Allocator> r = rhs;
3241+
r.insert(0, lhs);
3242+
return r;
3243+
\end{codeblock}
32563244
\end{itemdescr}
32573245

32583246
\indexlibrarymember{operator+}{basic_string}%
32593247
\begin{itemdecl}
32603248
template<class charT, class traits, class Allocator>
32613249
basic_string<charT, traits, Allocator>
3262-
operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
3250+
operator+(charT lhs, const basic_string<charT, traits, Allocator>& rhs);
32633251
\end{itemdecl}
32643252

32653253
\begin{itemdescr}
32663254
\pnum
3267-
\returns
3268-
\tcode{lhs + basic_string<charT, traits, Allocator>(rhs)}.
3269-
3270-
\pnum
3271-
\remarks
3272-
Uses
3273-
\tcode{traits::length()}.
3255+
\effects
3256+
Equivalent to:
3257+
\begin{codeblock}
3258+
basic_string<charT, traits, Allocator> r = rhs;
3259+
r.insert(r.begin(), lhs);
3260+
return r;
3261+
\end{codeblock}
32743262
\end{itemdescr}
32753263

32763264
\indexlibrarymember{operator+}{basic_string}%
32773265
\begin{itemdecl}
32783266
template<class charT, class traits, class Allocator>
32793267
basic_string<charT, traits, Allocator>
3280-
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);
3268+
operator+(charT lhs, basic_string<charT, traits, Allocator>&& rhs);
32813269
\end{itemdecl}
32823270

32833271
\begin{itemdescr}
32843272
\pnum
3285-
\returns
3286-
\tcode{std::move(lhs.append(rhs))}.
3287-
3288-
\pnum
3289-
\remarks
3290-
Uses
3291-
\tcode{traits::length()}.
3273+
\effects
3274+
Equivalent to:
3275+
\begin{codeblock}
3276+
rhs.insert(rhs.begin(), lhs);
3277+
return std::move(rhs);
3278+
\end{codeblock}
32923279
\end{itemdescr}
32933280

32943281
\indexlibrarymember{operator+}{basic_string}%
@@ -3300,8 +3287,13 @@
33003287

33013288
\begin{itemdescr}
33023289
\pnum
3303-
\returns
3304-
\tcode{lhs + basic_string<charT, traits, Allocator>(1, rhs)}.
3290+
\effects
3291+
Equivalent to:
3292+
\begin{codeblock}
3293+
basic_string<charT, traits, Allocator> r = lhs;
3294+
r.push_back(rhs);
3295+
return r;
3296+
\end{codeblock}
33053297
\end{itemdescr}
33063298

33073299
\indexlibrarymember{operator+}{basic_string}%
@@ -3313,8 +3305,12 @@
33133305

33143306
\begin{itemdescr}
33153307
\pnum
3316-
\returns
3317-
\tcode{std::move(lhs.append(1, rhs))}.
3308+
\effects
3309+
Equivalent to:
3310+
\begin{codeblock}
3311+
lhs.push_back(rhs);
3312+
return std::move(lhs);
3313+
\end{codeblock}
33183314
\end{itemdescr}
33193315

33203316
\rSec3[string.comparison]{Non-member comparison functions}

0 commit comments

Comments
 (0)