17歳からのプログラミング入門。

情報系の門の先で起きたことをたまにメモ。

大阪Effective Modern C++勉強会 #4

大阪Effective Modern C++勉強会 #4に参加してきました。今回の参加者は8人です。

今回のメインテーマは「autoが便利な時・便利じゃない時」と「初期化の書き方」です。 前回に比べて読み進めるのは難しくなってきてますね・・・はい。

ただ、不思議なことに今回のトピックには僕がその短いC++歴で引っかかった内容が多く紹介されており、つらい気持ちになりました。 僕が昔踏んで、今日読んだ範囲に紹介されていたのは以下のようなものです。

#include<bits/stdc++.h>
int main(){
    std::unordered_map<std::string, int> mp{{"hoge", 1}, {"fuga", 3}};

    for(std::pair<std::string, int>&& p : mp){
        ++p.second;
    }

    std::cout << mp["hoge"] << " , "<< mp["fuga"] << std::endl; //output "1 , 3"
}

これはstd::unordered_map<std::string, int>の要素がstd::pair<const std::string, int>型であることに由来して起こるもので、 いくら&&をつけていようが、const std::stringをstringに落とすには新しいオブジェクトを作るしかないので、 ++p.secondは一時的に生成されたオブジェクトに実行され、mpの要素のpairには適用されない、ということらしいです。

ちなみに、生半可な知識でstd::pair<std::string, int>&という風に昔書いてて、コンパイルエラーを食らいましたね。 理由はconstが・・・っていう上のやつです。 知識は今も生半可ですが、それでもちょっとずつはC++力がついてきているのかなあ・・・??って思ってます。まだまだまだまだだけど。

前回の繰り返しですが、読書会に関わった全ての型に感謝です。

さて次回は2/15ということで、期末試験前日です。気合入れて読書会行かなきゃ。

このあたりで僕は、精度を落とす専用のcastについて調べてきます。