[C++11]auto変数を使おう!ただし慎重に... |
2014年11月22日01:15:32 |
|
auto変数は型推論をして自動的に型を割り振ってくれる非常に便利なものです。 |
1
2
3
| auto i = 10;
auto f = 10.0f;
auto d = 10.0; |
一見便利なのですが、プログラマ自身は型を知っておく必要があるので
元に戻すには脳内コンパイルおよび目グレップを行わなくてはなりません。
読み手が困るだけなので、乱用はオススメしません。
効果的な使い方は型が自明でかつ、その場で利用するものが好ましいでしょう。
私が利用する場合は、イテレータやラムダ式での利用のみです。 |
1
2
3
4
5
6
7
| #include <array>
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
for( auto i=arr.begin(); i != arr.end(); ++i )
{
} |
1
2
3
| auto lambda = [](int i){ return i; };
lambda( 10 ); |
autoの注意点です。
型推論時に付いていれば別ですが、constや参照は自動で付けてくれません。
その辺りは手動で行わなくてはならないので、意識する必要があります。
困る事例はforeachを利用した場合です。 |
1
2
3
4
5
6
7
8
|
#include <array>
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
for( auto i: arr )
{
i = 10;
} |
正しくはこうです。 |
1
2
3
4
5
6
7
| #include <array>
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
for( auto& i: arr )
{
i = 10;
} |
コンテナの中身がオブジェクトの場合には参照をつけておかないと
コピーコンストラクタが毎回走ってしまう悲惨なことになります。
細心の注意を払わなければならない機能なのでもろ手を挙げてオススメはできないですね…
余談ですがauto変数って始めて聞いたとき「記憶クラス」の事だよねーって一瞬本気で思いました。
[記憶クラス]
auto: 自動変数(ローカル変数) ※省略するとこれになる
extern: 外部変数
static: 静的変数
register: レジスタ変数 ※可能な限りレジスタを使う
ちなみにintの変数宣言をフルスペック(?)で書くとこんな感じになります。 |
1
| auto signed int i; |
同じキーワードで紛らわしいと思ったものです。 |
|