半端に手を出すと混乱しそうだったので、横目で状況を見つつもまったく手をつけていなかったC++0x。
今夏、正式に採択されはれて標準に。
ってなことで。
遅ればせながらC++0x改めC++11に手を出して見ました。
今はこのあたりを読んでいるレベル。
- C++11のコーディング変更点まとめ | マイナビニュース
- Elements of Modern C++ Style | Sutter’s Mill
- http://www2.research.att.com/~bs/C++0xFAQ.html
- http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja(上記の日本語訳)
以前から「ずいぶん盛ったな」という印象があったんですが、実際かなり盛られていました。
ただ、同時に思っていた「雑多な感じ」というのは仕様山盛りからくる先入観だったようで「思いのほかすっきりしている」というのが個人的な印象。上記の「C++11 FAQ」にもありますが、一般化された、抽象度が上がった、という感じです。
具体的には。「Haskellっぽくなったな」。意図としては、より宣言的な記述ができるようになったな、ということですが、宣言的な言語の中でコードを書けるほど知っているのがHaskellだったので、「Haskellっぽい」という印象が浮かんだんだと思います。
と、いうことで。ちょっとコードを。
#include <iostream> #include <algorithm> int main(int, char* []) { char s[] = "Hello C++11!!\n"; std::for_each(std::begin(s), std::end(s), [](char c){ std::cout.put(c); }); return 0; }
楽しい(笑)。
Haskellで書くとこんな感じ?。
s = "Hello C++11!! from Haskell\n" main = sequence_ [ putChar c | c <- s ]
ただ。いきなりつまづきが。
このコード。
char s[] = "Hello C++11!!\n";
本当はこう書きたかった。
auto s = "Hello C++11!!\n";
しかし、こう書くとs
はconst char*
と解釈されてしまう模様。従来の仕様から考えればそのほうが妥当とは思います。とはいえ、これから先いろいろつまづきそうな予感。
追記
GCC 4.6.2 (MS-Windows7 + Cygwin)での話。仕様なのか現在の実装なのか、確認するのを忘れてました。
仕様に文字列リテラルなんてのも追加されているようなので、そのあたりもあたってみないといけないですね。
さらに追記(2012/01/19)
id:ons さんにコメント欄で情報を頂きました。ありがとうございます。
N2765という仕様でC++11でのリテラルの扱いについて記載されているようです。
…ようです、が。斜め読みでは意味が取れない…。
…わたしの語学力は置いといて。当該仕様の実装状況がGCCのページにありました。
実装状況 | N2765 |
---|---|
Status of Experimental C++0x Support in GCC 4.6 | No |
Status of Experimental C++11 Support in GCC 4.7 | Yes |
なるほどー。
というわけで、4.7にバージョンアップしたあかつきには確認してみたいと思います。