したがって、C++ 文字列関数
string& erase ( size_t pos = 0, size_t n = npos )
戻ります*this
。どういう意味ですか?何かを返すためになぜそれが必要なのですか?
例
string name = "jimmy";
name.erase(0,1);
は消去j
して になりimmy
ますが、何かを返す必要があるのはなぜですか?
メソッドチェーン用。たとえば、消去した後、それを呼び出し==
て何かを確認できます。
string name = "jimmy";
bool b = name.erase(0,1) == "immy";
これは便宜上のものにすぎません。たとえば、次のように呼び出しを連鎖させることができます。
name.erase(0,1).erase(3,1);
あなたの例では、式が次のとおりであるため、何も返す必要はありません。
name.erase(0,1)
次と同等です。
((void)name.erase(0,1), name)
たとえば、次のように書くことができます。
while(name.erase(0,1).size()) {
std::cout << name << '\n';
}
また:
while((name.erase(0,1), name).size()) {
std::cout << name << '\n';
}
また:
while(name.erase(0,1), name.size()) {
std::cout << name << '\n';
}
また:
while(true) {
name.erase(0,1);
if (!name.size()) break;
std::cout << name << '\n';
}
標準は、おそらく、戻り値を「無駄にする」のではなく、何かの戻り値を使用する可能性があることに基づいて、選択肢を提供することを決定しました。
基本的に、変数名を繰り返したり、中間結果への参照を取るコードを少し節約できる場合があります。
呼び出されたオブジェクトを変更する関数は何も返すべきではないと考える人もいます (副作用のある関数の使用をステートメントごとに 1 つに制限するという考え方です)。C++ では、標準ライブラリの設計者が同意しないという事実を受け入れなければなりません。
次のようなことができます。
void process(std::string const &s) {}
process(name.erase(0,1)); //self-explanatory?
std::cout << name.erase(0,1) << std::endl;
//etc
そして、他の回答が言及したこと。