命名空间
变体
操作

std::basic_string<CharT,Traits,Allocator>::operator=

来自 cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
basic_string::operator=
元素访问
迭代器
容量
修饰符
搜索
操作
常量
非成员函数
I/O
比较
(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(直到 C++20)(C++20)
数值转换
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
文字
帮助类
推导指南 (C++17)

 
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 的副本替换内容。如果 *thisstr 是同一个对象,则此函数没有效果。
2) 使用 SequenceContainer 的移动赋值语义,用 str 的内容替换内容。
与其他序列容器移动赋值不同,对 str 中元素的引用、指针和迭代器可能会失效。
3)s 指向的以 null 结尾的字符字符串的内容替换内容,如同使用 assign(s, Traits::length(s))
4) 用字符 ch 替换内容,如同使用 assign(std::addressof(ch), 1)
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>>
truestd::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 ||

         std::allocator_traits<Allocator>::is_always_equal::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
(公共成员函数) [edit]
将字符分配给字符串
(公共成员函数) [edit]
分配一个视图
(std::basic_string_view<CharT,Traits> 的公共成员函数) [edit]