トップ «前の日記(2018-02-28) 最新 次の日記(2018-03-04)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2018-03-03

_ 江添亮の詳説C++17

アスキーの鈴木さんからいただいた。

電話帳のような本を想像していたら、とんでもなくコンパクト(対電話帳比。ところで今も電話帳って存在するのか?)で驚いた。C++17の新機能に的を絞った本だからだった。

これはおもしろい。

とりあえず読み始めると、早くも本文2ページ目にして筆者がLinus翻訳で磨き上げた表現、つまりそびえたつものが出て来たりするので、単に規格書を翻訳して味付けした本ではないということがわかる。まあ、鈴木さんのところでそういう本を作ることはあり得ないだろう。というわけで、江添さんの規格書フィルターと特徴的な文体(客観的に突き放した主観表現)が特徴の本ということになる。割と好きだ。

それにしても(と読みながら思う)、プリプロセッサはクソだから捨てるべしとストラウストラップが書いていたように思うのだが、C++でポータビリティがあるコードを書くためには結局プリプロセッサが必須というのはおもしろい(というか、プリプロセッサが滅びないのは仕組み上当然だと思う。ストラウストラップが滅ぼそうとしたのはユーザー定義の関数的マクロだよな。でもそのための武器のinlineの扱いも本書を読むと変わっているが、そもそも登場時からサジェスチョン用キーワードであって、必ずしもinlineで修飾したからといってインライン展開されるということはなかったように思うし、そう規格化されていたように思うのだが)。

実際には最初から読み始めたわけではなく、ぱらぱら眺めているうちに、なんだろうと気になったconstexpr ifのパートからで、そこでautoという意味不明な、しかし関数の返り値を代入して初期化する変数宣言の型の箇所に書いてあるキーワードを見て、なんかC#でいうところのvarみたいなものがC++にも入ったのかな? と索引を見て初出の8ページにさかのぼって、とかやっているうちにおもしろいから最初から読み始めたのだった。

それにしても、元ネタのCの自動変数の型修飾子キーワードが、いつのまにやら推測を依頼する型名用のキーワードになったところがおもしろい(なぜ、varとしなかったのかなぁ。varはCのキーワードではないから利用安全だと思うのだが)。よほどJavaScriptとかC#とかを想起させないようにキーワードを選んでいるのかな、それとも知らんうちにvarがキーワードになっているのか? と索引を見ると、varはないがvariantという疑似(プリプロセッサによってstdネームスペースに組み込まれる)キーワードが導入されていたりして、確かにvariantだと思ったり。variantのコード例を見ると、もうunionのメンバー名を指定する必要すらないのだなと、ちょっと感動した。

それにしてもおもしろい。

if (int x = 1 ; x)の箇所は例が悪すぎて不思議になりながら次のページで導入のモチベーションが示されて、最後に意味がある例が出てくるが、else節では使えないのだろうか? とかは疑問が残った(で、ここでわからないから規格書をあたる必要があるので、その点に関しては、いまいちな詳説に思える反面、ifの条件式のスコープは直後のブロックだというのは自明なようにも思えるので、もしそうならば、言語仕様としては一貫性はあるが不自由だ。JavaやC#のtry節で宣言した変数がcatchやfinallyで参照できないのと同じだな……

適当に開けば、*thisが関数に閉包されるようになったとか、gcdとlcmとか今まで存在しなかったのかとか、std::byteが今頃とか(いや、これは21世紀の自然言語の扱い(の逆でバイナリデータの扱いが従になったことに)によって再発見されたものだと考えた方が自然だな、とかRubyのASCII8BITの扱いの変化とかを思い出したりとか。

と言う調子で、想像と異なり、読んでいると考えることがたくさんあっていつまでも読んでいられる。C++はやっぱりおもしろい。

という具合に実におもしろい本だった。気に入った。

江添亮の詳説C++17(江添 亮)

本日のツッコミ(全2件) [ツッコミを入れる]
_ 江添亮 (2018-03-03 18:25)

varのような小文字3文字のキーワードを莫大なコード資産があるC++にいれることはできない。 <br> <br>auto型指定子はC++11から追加された古い機能なので流石に説明は省きました。 <br> <br>variantは単なるライブラリです。

_ arton (2018-03-03 22:36)

説明ありがとうございます。まあCも新規に追加するキーワードは_Boolみたいな不格好なやつだから、歴史がある言語ならではですね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|

ジェズイットを見習え