Visual C++ 2010 の新機能メモ

Visual C++ 2010 の新機能
http://msdn.microsoft.com/ja-jp/library/dd465215.aspx

C++/CLIのインテリセンスが効かないので、C++/CLI関係は駄目なのですが、C++はかなり便利機能満載なので、メモ書き。

■autoキーワードで型推論が使える

最初に言っておくと、「auto」はC++のキーワードで、内部変数の有効期間を示すものなのですが、滅多に使われない(というか全く使われない)ので、Visual C++ では「型推論」のために意味が変更されています。

なので、/Zc:auto なるスイッチが導入されています。デフォルトでは、型推論が有効な状態ですね。
http://msdn.microsoft.com/ja-jp/library/dd293615.aspx

書き方は、

auto i = 10 ;

なんて形で書きます。これだと余り意味がないので、

vector <int> vec ;
vector <int>::iterator it = vec.begin();

の代わりに

auto it = vec.begin();

なんてことが出来ます。

この型推論ですが、F#のタプルを扱う時や、C#での複雑なLINQを扱うとき(C++にLINQはないけど)に便利です。

 

■ラムダ式

ラムダは無名関数とも呼ばれますが、algorithm 関係で比較式を扱うときに便利です。

例えば、sort 関数の場合、比較関数を指定できるのですが、今までは必ず関数を作る必要がありました。

int comp( int x, int y ) { return x < y ; }

sort( vec.begin(), vec.end(), comp );

な感じで、comp関数が必要なのですが、ラムダ式を使うと、

sort( vec.begin(), vec.end(), [=](int x, int y ) { return x < y; });

な感じで、その場で書けます。

いくつか書き方があるので、詳細は調べないと駄目なんですが、mutalble というキーワードを使うところを見ると、F# の影響も入っているようです。

 

■nullptrの利用

長らく、NULLポインタを表すものは、

#define NULL (void*)(0)

で定義されていた訳ですが、Visual C++ 2010 では決別したいようですw

if ( p != NULL ) {

のところを

if ( p != nullptr ) {

と書き換えができます。

nullptr
http://msdn.microsoft.com/ja-jp/library/4ex65770.aspx

を見ると、/clr が必須なようですが、ネイティブのC++を使った場合も通ります。

ってここが改変点なのに! Visual C++ 2008 だとネイティブのほうは nullptr が通りません。

これの便利な処はですね、組み込みシステム何かを作っていると、「#include <stdio.h>」なんてのができません。なので、自前で #define NULL (0) ってことをやることが多いのですが、別の会社でもやっていると、

#ifndef NULL
#define NULL (0)
#endif

なんてのが、頻繁に出てきます。これを回避するために、nullptr が…って、あと、ポインタと0の混在が…、組み込みだと Visual C++なんて使わないですよね~。

  • NULLの再定義による副作用を避けるために、nullptr の導入
  • C++/CLI で使われるNULLポインタと合わせるために、C++にnullptrを導入
  • templateプログラミングでNULLポインタが扱える

ってところですね。

ちなみに、sizeof( nullptr ) ってのも通って、値は「4」です。int型になっているみたいですね。代入は、char *でも、double *でも、NULL同様にできます。

カテゴリー: 開発 パーマリンク