std::basic_string<CharT,Traits,Allocator>::operator=
来自 cppreference.com
< cpp | string | basic string
basic_string& operator=( const basic_string& str ); |
(1) | (自 C++20 起为 constexpr) |
basic_string& operator=( basic_string&& str ) noexcept(/* see below */); |
(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 指向的以 null 结尾的字符字符串的内容替换内容,如同使用 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 | - | 指向以 null 结尾的字符字符串的指针,用作源以初始化字符串 |
ilist | - | std::initializer_list 用于初始化字符串 |
t | - | 可转换为 std::basic_string_view 的对象,用于初始化字符串 |
[编辑] 返回值
*this
[编辑] 复杂度
1) str 大小的线性。
2) 与 *this 大小线性相关(形式上,每个
CharT
必须被销毁)。如果分配器不比较相等且不传播,则还与 str 的大小线性相关(必须进行复制)。3) 与 s 的大小线性相关。
4) 常数时间。
5) 与 ilist 的大小线性相关。
6) 与 t 的大小线性相关。
[edit] 异常
2)
noexcept 规范:
noexcept(std::allocator_traits<Allocator>::
propagate_on_container_move_assignment::value ||
如果操作会导致 size
() >
max_size
(),则抛出 std::length_error。
如果由于任何原因抛出异常,则此函数无效(强异常安全保证)。
[edit] 示例
运行此代码
#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'; // "" or "alpha" (unspecified) // (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; // equivalent to str1 = static_cast<char>(35U); std::cout << std::quoted(str1) << '\n'; // "#" (ASCII = 35) }
可能的输出
"alpha" "alpha" "alpha" "" "beta" "!" "gamma" "#"
[edit] 缺陷报告
以下更改行为的缺陷报告已追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确的行为 |
---|---|---|---|
LWG 847 | C++98 | 没有异常安全保证 | 添加了强异常安全保证 |
LWG 2063 | C++11 | 移动赋值运算符没有遵循 SequenceContainer 的语义要求 |
遵循 |
LWG 2946 | C++17 | 重载 (6) 在某些情况下会导致歧义 | 通过使其成为模板来避免 |
[edit] 另请参见
构造一个 basic_string (公共成员函数) | |
将字符分配给字符串 (公共成员函数) | |
分配一个视图 ( std::basic_string_view<CharT,Traits> 的公共成员函数) |