エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

C++11に(ようやく)手を出す(そしていきなりつまづく)

半端に手を出すと混乱しそうだったので、横目で状況を見つつもまったく手をつけていなかったC++0x
今夏、正式に採択されはれて標準に。

ってなことで。

遅ればせながらC++0x改めC++11に手を出して見ました。


今はこのあたりを読んでいるレベル。


以前から「ずいぶん盛ったな」という印象があったんですが、実際かなり盛られていました。
ただ、同時に思っていた「雑多な感じ」というのは仕様山盛りからくる先入観だったようで「思いのほかすっきりしている」というのが個人的な印象。上記の「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";

しかし、こう書くとsconst 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にバージョンアップしたあかつきには確認してみたいと思います。