auto: 型推論でコードを簡潔に

C++11の革命。長い型名とおさらば。

auto
コンパイラに型推論させる。
decltype
式の型を取得。
後置戻り値型
-> で戻り値型を後ろに書く。

auto とは?

カメレオン (Chameleon)

auto はカメレオンです。座っている場所(初期化される値)に合わせて、自分の色(型)を自動的に変えます。「10」の上に座れば int になり、「"hello"」の上に座れば string になります。

昔のC++では、プログラマが律儀に全ての型を書いていました。しかしコンパイラは実は右辺を見れば型が分かっています。auto は「コンパイラが分かることはコンパイラに任せる」という現代的なスタイル(AAA: Almost Always Auto)の基本です。

Basic auto
// 基本的な auto
auto x = 42; // int
auto y = 3.14; // double
auto s = "hello"s; // std::string
// イテレータで便利
std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << "
";
}
// 範囲for文
for (auto& elem : v) {
elem *= 2; // 参照で変更
}
型推論結果
auto x = 42;       // int\nauto y = 3.14;     // double\nauto it = v.begin(); // vector::iterator
Bad
// ❌ Bad: 長い型名を繰り返し
std::map<std::string, std::vector<int>>::iterator it
= myMap.begin();
Good
// ✅ Good: auto で簡潔
auto it = myMap.begin();

高度な使い方

auto + References
// auto + const/&
const auto& ref = expensiveObject; // const参照
auto&& universal = getResult(); // 転送参照
// 戻り値型の推論
auto add(int a, int b) {
return a + b; // int を推論
}
// 後置戻り値型
auto multiply(int a, int b) -> int {
return a * b;
}
// decltype(auto) で正確な型を維持
decltype(auto) getRef() {
static int x = 10;
return (x); // int& を返す
}
Tip: 参照を保持したいときは auto& か const auto&。

合格ライン

auto と auto& の違いを説明できる
範囲for文で auto を使える

参考リンク

演習課題

課題1: auto vs auto&
vectorの要素を範囲forで変更するとき、auto& と auto の違いを確認してください。
課題2: 型推論の実験
decltype を使って auto で推論された型を表示してください。

次のステップ