名前空間
変種
操作

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

From cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
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 のコピーで内容を置き換えます。もし *thisstr が同じオブジェクトの場合、この関数は何も影響を与えません。
2) str の内容を SequenceContainer のムーブ代入セマンティクスを使用して置き換えます。
他のシーケンスコンテナのムーブ代入とは異なり、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_stringnullptr から代入できません。

目次

[edit] パラメータ

文字 - 文字列の文字を初期化するために使用される値
str - 文字列を初期化するために使用されるソース文字列
s - 文字列を初期化するために使用されるヌル終端文字列表記へのポインタ
ilist - std::initializer_list で文字列を初期化
t - std::basic_string_view に変換可能なオブジェクトで文字列を初期化

[edit] 戻り値

*this

[edit] 計算量

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 のセマンティクスの要件に従っていませんでした。
follows
LWG 2946 C++17 オーバーロード (6) は、一部のケースで曖昧さを引き起こしました。 テンプレートにすることで回避されました。

[edit] 関連項目

basic_string を構築する
(public member function) [編集]
文字列に文字を代入する
(public member function) [編集]
ビューを代入する
(std::basic_string_view<CharT,Traits> の public member function) [edit]
English 日本語 中文(简体) 中文(繁體)