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 の使用方法についてはまた今度。