メンバ関数に代入する

stringクラスについて勉強中に気になる記述が。

#include <string>
#include <iostream>
using namespace std;

int main () {
    string str("abcdedf");
    
    try {
        str.at(100) = 'a';
    }
    catch( out_of_range e ) {
        cout << "範囲外のデータにアクセスしました" << endl;
    };
    
    return 0;
}

この処理なんだけど、よくよく考えればatメンバ関数に対して代入処理してるよね?

これってまだ今まで習った中に出てこなかった構文だと思うんだ。

とりあえずどういう検索語句で調べればいいのかも良くわからなかったのでなんかテキトーに試してたら動いたのでとりあえず記録を残す。

#include <iostream>
#include <iostream>
using namespace std;

class CSample {
public:
    int m_num;
    CSample () { m_num = 100; }
    int& foo () { return m_num; }
};

int main () {
    CSample obj;
    
    obj.foo() = 999;
    
    cout << obj.m_num << endl;
    
    return 0;
}
$ main
999

fooメンバ関数はm_numの参照を返すので、それに対して代入していることになる。

構文エラーにならないのが凄いね。

つまりこういう使い方することを想定してるってことだろうなぁ。