Namespaces
Variants

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

From cppreference.net
std::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 是同一对象,则此函数不产生任何效果。
2) 使用 SequenceContainer 的移动赋值语义,将内容替换为 str 的内容。
与其他序列容器移动赋值操作不同,指向 str 元素的引用、指针和迭代器可能会失效。
3) 将内容替换为由以空字符结尾的字符串指针 s 所指向的内容,如同通过 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 >>
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 ||

std:: allocator_traits < Allocator > :: is_always_equal :: 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> 的公开成员函数)