std::basic_string<CharT,Traits,Allocator>:: operator=
From cppreference.net
<
cpp
|
string
|
basic string
|
basic_string
&
operator
=
(
const
basic_string
&
str
)
;
|
(1) | (自 C++20 起为 constexpr) |
|
basic_string
&
operator
=
(
basic_string
&&
str
)
noexcept ( /* 见下文 */ ) ; |
(2) |
(自 C++11 起)
(自 C++20 起为 constexpr) |
|
basic_string
&
operator
=
(
const
CharT
*
s
)
;
|
(3) | (自 C++20 起为 constexpr) |
|
basic_string
&
operator
=
(
CharT ch
)
;
|
(4) | (自 C++20 起为 constexpr) |
|
basic_string
&
operator
=
(
std::
initializer_list
<
CharT
>
ilist
)
;
|
(5) |
(自 C++11 起)
(自 C++20 起为 constexpr) |
|
template
<
class
StringViewLike
>
basic_string & operator = ( const StringViewLike & t ) ; |
(6) |
(自 C++17 起)
(自 C++20 起为 constexpr) |
|
basic_string
&
operator
=
(
std::
nullptr_t
)
=
delete
;
|
(7) | (自 C++23 起) |
替换字符串的内容。
1)
将内容替换为
str
的副本。如果
*
this
与
str
是同一对象,则此函数不产生任何效果。
与其他序列容器移动赋值操作不同,指向
str
元素的引用、指针和迭代器可能会失效。
3)
将内容替换为由以空字符结尾的字符串指针
s
所指向的内容,如同通过
assign
(
s, Traits
::
length
(
s
)
)
执行操作。
5)
将内容替换为初始化列表
ilist
的内容,如同执行
assign
(
ilist.
begin
(
)
, ilist.
size
(
)
)
操作。
6)
隐式转换
t
为字符串视图
sv
,如同通过
std::
basic_string_view
<
CharT, Traits
>
sv
=
t
;
,随后用
sv
的内容替换当前内容,如同通过
assign
(
sv
)
。
此重载仅当
std::
is_convertible_v
<
const
StringViewLike
&
,
std:: basic_string_view < CharT, Traits >> 为 true 且 std:: is_convertible_v < const StringViewLike & , const CharT * > 为 false 时参与重载决议。
std:: basic_string_view < CharT, Traits >> 为 true 且 std:: is_convertible_v < const StringViewLike & , const CharT * > 为 false 时参与重载决议。
7)
std::basic_string
无法从
nullptr
赋值。
目录 |
参数
| ch | - | 用于初始化字符串字符的值 |
| str | - | 用作初始化字符串来源的字符串 |
| s | - | 指向以空字符结尾的字符串的指针,用作初始化字符串来源 |
| ilist | - | std::initializer_list 用于初始化字符串 |
| t | - | 可转换为 std::basic_string_view 的对象,用于初始化字符串 |
返回值
* this
复杂度
1)
与
str
的大小呈线性关系。
2)
与
*
this
的大小呈线性关系(严格来说,每个
CharT
都需要被销毁)。如果分配器不相等且不传播,则还与
str
的大小呈线性关系(必须进行复制)。
3)
与
s
的大小呈线性关系。
4)
常量。
5)
与
ilist
的大小成线性关系。
6)
与
t
的大小呈线性关系。
异常
2)
noexcept
规范:
noexcept
(
std::
allocator_traits
<
Allocator
>
::
propagate_on_container_move_assignment
::
value
||
如果该操作将导致
size()
超过
max_size()
,则抛出
std::length_error
。
若因任何原因抛出异常,此函数不产生任何效果( 强异常安全保证 )。
示例
运行此代码
#include <iomanip> #include <iostream> #include <string> int main() { std::string str1; std::string str2{"alpha"}; // (1) operator=(const basic_string&); str1 = str2; std::cout << std::quoted(str1) << ' ' // "alpha" << std::quoted(str2) << '\n'; // "alpha" // (2) operator=(basic_string&&); str1 = std::move(str2); std::cout << std::quoted(str1) << ' ' // "alpha" << std::quoted(str2) << '\n'; // "" 或 "alpha" (未指定) // (3) operator=(const CharT*); str1 = "beta"; std::cout << std::quoted(str1) << '\n'; // "beta" // (4) operator=(CharT); str1 = '!'; std::cout << std::quoted(str1) << '\n'; // "!" // (5) operator=(std::initializer_list<CharT>); str1 = {'g', 'a', 'm', 'm', 'a'}; std::cout << std::quoted(str1) << '\n'; // "gamma" // (6) operator=(const T&); str1 = 35U; // 等价于 str1 = static_cast<char>(35U); std::cout << std::quoted(str1) << '\n'; // "#" (ASCII = 35) }
可能的输出:
"alpha" "alpha" "alpha" "" "beta" "!" "gamma" "#"
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 847 | C++98 | 未提供异常安全保证 | 增加了强异常安全保证 |
| LWG 2063 | C++11 |
移动赋值运算符未遵循
SequenceContainer 的语义要求 |
已遵循 |
| LWG 2946 | C++17 | 重载 ( 6 ) 在某些情况下会导致歧义 | 通过将其设为模板来避免 |
参见
构造
basic_string
(公开成员函数) |
|
|
为字符串赋值字符
(公开成员函数) |
|
|
赋值视图
(
std::basic_string_view<CharT,Traits>
的公开成员函数)
|