C++は明示的に書かれていない関数がいろいろ呼ばれるのが初心者泣かせだよなぁ
C++はデストラクタ、コピーやmove系のコンストラクタやassignment、キャスト系の演算子など、明示的にかかれていないものが自動で呼ばれる事が多々ある。 これらの書かれていないコードがいろいろ実行されている、というのが初心者泣かせだよなぁ、と思った。
ある言語を良く分かって無くても、書かれている通りに動いていればだいたいは予想出来る。 けれどC++は書かれてない事がいろいろ動く上に、 それを意図したように動かす必要があるので、 C++を詳しくないと誤解しやすいのが初心者にとって敷居が高いよなぁ、と思う。
しかも明示的に書かれてないコードが動くのは、すごく良く発生し、 あまり分かってない人でも必ずそういうコードをたくさん書いてしまう事になる。 もっというと割と詳しい人でも意図してないコード呼び出しが起こっていて驚く事があるくらいだ。
ある程度詳しい人は意図してないコード呼び出しがあった時にコンパイルエラーになるように意図的にやっている。 実際意図していないコード呼び出しがコンパイル時に検出出来なくては、怖くて使ってられない。 けれど意図してないコード呼び出しをコンパイルエラーにするには、結構いろいろなC++の機能を使う必要があるので、 初心者には敷居が高いコードになりがちだ。
初心者ほどコンパイルエラーにならない間違ったコードを書きがち、 というのがC++が初心者と仕事をするのが絶望的に向いてない言語と思うところだよなぁ。 初心者が書くC++コードは、 誤った使い方と誤った使い方が掛け合わさって正しく動くコードというのが良くあったりして、 パズルになっていたりする。 パズルとしては面白い事もあるが、正しいかどうかをコードを見て判定するのは初心者のコードほど難しい。
なんか難しそうな機能は使わずに基本的な機能だけ使ってなるべく初歩的な範囲で書けるようにコードを書こう、 という他の言語なら妥当な初心者的態度が、 C++でだけは極めて酷い事態を引き起こしてしまう。
明示的に書かれていないコードをいろいろ意図的に動かせるのは、 書く側としては便利ではある。 書く量よりも多くを動かせるので。 それがある程度大きなものを書く時にC++の強みとなっている。
けれど初心者には信じがたいほど多くを要求する言語にもなってしまっているよなぁ。 その難しさが見た目で判断出来ないのが厳しい。 書かれていない事を理解していないと認識するのは、なかなか難度が高い。 この学習のしづらさはC++の大きな欠点だよな。