std::string operator=
- 自 C++23 起
- 自 C++20 起
- 自 C++17 起
- 自 C++11 起
- 直到 C++11
// (1) Non const version only
constexpr basic_string& operator=( const basic_string& str );
// (2) Non const version only
constexpr basic_string& operator=( basic_string&& str ) noexcept(/* see below */);
// (3) Non const version only
constexpr basic_string& operator=( const CharT* s );
// (4) Non const version only
constexpr basic_string& operator=( CharT ch );
// (5) Non const version only
constexpr basic_string& operator=( std::initializer_list<CharT> ilist );
// (6) Non const version only
template<class StringViewLike>
constexpr basic_string& operator=( const StringViewLike& t );
// (7) Non const version only
constexpr basic_string& operator=( std::nullptr_t ) = delete;
// (1) Non const version only
constexpr basic_string& operator=( const basic_string& str );
// (2) Non const version only
constexpr basic_string& operator=( basic_string&& str ) noexcept(/* see below */);
// (3) Non const version only
constexpr basic_string& operator=( const CharT* s );
// (4) Non const version only
constexpr basic_string& operator=( CharT ch );
// (5) Non const version only
constexpr basic_string& operator=( std::initializer_list<CharT> ilist );
// (6) Non const version only
template<class StringViewLike>
constexpr basic_string& operator=( const StringViewLike& t );
// (1) Non const version only
basic_string& operator=( const basic_string& str );
// (2) Non const version only
basic_string& operator=( basic_string&& str ) noexcept(/* see below */);
// (3) Non const version only
basic_string& operator=( const CharT* s );
// (4) Non const version only
basic_string& operator=( CharT ch );
// (5) Non const version only
basic_string& operator=( std::initializer_list<CharT> ilist );
// (6) Non const version only
template<class StringViewLike>
basic_string& operator=( const StringViewLike& t );
// (1) Non const version only
basic_string& operator=( const basic_string& str );
// (2) Non const version only
basic_string& operator=( basic_string&& str );
// (3) Non const version only
basic_string& operator=( const CharT* s );
// (4) Non const version only
basic_string& operator=( CharT ch );
// (5) Non const version only
basic_string& operator=( std::initializer_list<CharT> ilist );
// (1) Non const version only
basic_string& operator=( const basic_string& str );
// (3) Non const version only
basic_string& operator=( const CharT* s );
// (4) Non const version only
basic_string& operator=( CharT ch );
替换字符串的内容。
-
(1) 复制赋值运算符。用
other
的内容的副本替换当前内容。注意如果
*this
和str
是同一个对象,则此函数无效。 -
(2) 移动赋值运算符。使用移动语义替换其他内容(即,其他数据从其他移动到此容器中)。
重要other
之后处于有效但未指定的状态。如果
std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value
为true
,则*this
的分配器将被str
的分配器的副本替换。如果它为
false
并且*this
和str
的分配器不相等,则*this
不能取得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::nullptr_t
的删除构造函数使得std::string
不能从nullptr
赋值。
参数
ch
- 用于初始化字符串字符的值str
- 用作源以初始化字符串的字符串s
- 指向空终止字符字符串的指针,用作源以初始化字符串ilist
- 用于初始化字符串的std::initializer_list
t
- 可转换为std::basic_string_view
的对象,用于初始化字符串
返回值
这个
复杂度
- (1) 与
str
的大小呈线性关系 - O(str.size())。 - (2)
在*this
的大小上呈线性 - O(size())。
如果分配器不相等且不传播,则也与str
的大小呈线性关系 - O(size() + str.size())。 - (3) 与
s
的大小呈线性关系 - O(s.size())。 - (4) 常数 - O(1)。
- (5) 与
ilist
的大小呈线性关系 - O(ilist.size())。
异常
- 自 C++17 起
- (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 <string>
#include <iostream>
#include <iomanip>
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"
"#"