auto キーワードの注意点

C++11 で auto キーワードが追加された。
このキーワードは C++ での型推論に用いられる。




auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);

auto otherVariable = 5;

これは特にテンプレート使用時に便利になる。

例えば for ループでは

for (std::vector<int>::const_iterator itr = myvec.begin(); itr != myvec.end(); ++itr)

と書くところを、

for (auto itr = myvec.begin(); itr != myvec.end(); ++itr)

と記述することができる。

さて、ここまでは Wikipedia の説明と同様だ。ここから、auto キーワードの注意点について記す。

それは、auto キーワードは型のみしか推論しないというところ。当たり前のように聞こえるが、実は困る場合がある。

それは、変数宣言に const や & がついていた場合。(ところで、& は参照演算子という呼び方で正しいのだろうか?)

auto キーワードにすべて任せてしまうと、思わぬところでコピーが走ってしまう。

#include <stdio.h>
struct X {
    X() {}
    X(const X&) { puts("copy cstr"); }
};
int main()
{
    X x[3];
    for (auto i : x) {} // copy cstrが3回呼ばれる
    for (const auto& i : x) {} // copy cstrは呼ばれない
}

従って、上記 for ループも

for (std::vector<int>::const_iterator itr = myvec.begin(); itr != myvec.end(); ++itr)

for (const auto itr = myvec.begin(); itr != myvec.end(); ++itr)

と書きなおすべきなのである。

まとめ

auto キーワードを使うときは、auto に入れる型は気にしなくて良くなるが、型の修飾子は気にしなくてはならない。
const や & も含めた完全な情報を推論して欲しいときは、decltype を使用する。
decltype の使用方法についてはまた今度。