std::basic_string<CharT,Traits,Allocator>::operator=
来自cppreference.com
< cpp | string | basic string
(1) | ||
basic_string& operator=( const basic_string& str ); |
(C++20 前) | |
constexpr basic_string& operator=( const basic_string& str ); |
(C++20 起) | |
(2) | ||
basic_string& operator=( basic_string&& str ) noexcept(/* 见下文 */); |
(C++11 起) (C++20 前) |
|
constexpr basic_string& operator=( basic_string&& str ) noexcept(/* 见下文 */); |
(C++20 起) | |
(3) | ||
basic_string& operator=( const CharT* s ); |
(C++20 前) | |
constexpr basic_string& operator=( const CharT* s ); |
(C++20 起) | |
(4) | ||
basic_string& operator=( CharT ch ); |
(C++20 前) | |
constexpr basic_string& operator=( CharT ch ); |
(C++20 起) | |
(5) | ||
basic_string& operator=( std::initializer_list<CharT> ilist ); |
(C++11 起) (C++20 前) |
|
constexpr basic_string& operator=( std::initializer_list<CharT> ilist ); |
(C++20 起) | |
(6) | ||
template<class T> basic_string& operator=( const T& t ); |
(C++17 起) (C++20 前) |
|
template<class T> constexpr basic_string& operator=( const T& t ); |
(C++20 起) | |
constexpr basic_string& operator=( std::nullptr_t ) = delete; |
(7) | (C++23 起) |
替换字符串的内容。
1) 以 str 的副本替换字符串的内容。如果 *this 和 str 为同一对象,那么此函数无效果。
3) 如同用 assign(s, Traits::length(s)) 以 s 所指向的空终止字符串的内容替换字符串的内容。
5) 如同用 assign(ilist.begin(), ilist.size()) 以初始化器列表 ilist 的内容替换字符串的内容。
6) 如同用 std::basic_string_view<CharT, Traits> sv = t; 将 t 隐式转换到字符串视图 sv ,然后如同用 assign(sv),以 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) 不能将 nullptr 赋值给
std::basic_string
。参数
ch | - | 用以初始化字符串的字符 |
str | - | 用作源初始化字符串的字符串 |
s | - | 指向空终止字符串的指针,用作源初始化字符串 |
init | - | 用作源初始化字符串的 std::initializer_list |
t | - | 可转换为用以初始化字符串的 std::basic_string_view 的对象 |
返回值
*this
复杂度
1) 与 str 的大小成线性。
2) 与 *this 的大小成线性(正式而言,必须销毁每个
CharT
)。如果分配器比较不相等且不传播,那么也与 str 的大小成线性(必须进行复制)。3) 与 s 的大小成线性。
4) 常数。
5) 与 init 的大小成线性。
异常
2)
noexcept 说明:
noexcept(std::allocator_traits<Allocator>:: propagate_on_container_move_assignment::value || |
(C++17 起) |
如果操作将导致 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; // equivalent to 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 | 移动赋值运算符没有遵循 知分配器容器 (AllocatorAwareContainer) 的语义要求 |
遵循 |
LWG 2946 | C++17 | 重载 (6) 在某些情况下会导致歧义 | 通过使之为模板来避免 |
参阅
构造 basic_string (公开成员函数) | |
赋值字符给字符串 (公开成员函数) | |
对视图赋值 ( std::basic_string_view<CharT,Traits> 的公开成员函数) |