「auto」の版間の差分
提供: C++入門
行92: | 行92: | ||
* 引数の型に[[auto]]が使えません。 | * 引数の型に[[auto]]が使えません。 | ||
* 戻り値の型を[[auto]]型にできません。 | * 戻り値の型を[[auto]]型にできません。 | ||
− | + | == エラー == | |
+ | * [[clang++のエラー error: 'auto' not allowed in function prototype]] | ||
== 関連項目 == | == 関連項目 == | ||
* [[C++11]] | * [[C++11]] | ||
行98: | 行99: | ||
* [[std::for_each]] | * [[std::for_each]] | ||
* [[BOOST_FOREACH]] | * [[BOOST_FOREACH]] | ||
− | <!-- vim: filetype=mediawiki --> | + | <!-- vim: filetype=mediawiki |
+ | --> |
2015年11月7日 (土) 17:58時点における最新版
C++のauto型とは、C++11で追加された型推論です。コンパイル時に型を推測し、適切な型として扱ってくれます。
読み方
- auto
- おーと
目次
概要
auto型を使用するとコードが簡単に書けるようになります。イテレータのコードが非常に単純になります。さらに Range based forを利用することにより、さらにコードは簡素になります。
これは、イテレータの例です。ループを書くために、たくさん書かないといけません。
std::vector<int> v; for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { ; }
autoキーワードを使うこと、簡単に書けます。
std::vector<int> v; for(auto it = v.begin(); it != v.end(); ++it) { ; }
auto型とポインタ、参照などの扱い
auto型の型推論は、以下のように扱われます。
int a = 123; auto* p = &a; // int* p = &a; auto& r = a; // int& r = a; const auto& c = a; // const int& c = a;
autoを用いたループの例
auto は、C++11 で追加されました。
ソースコード auto1.cpp
このプログラムは、std::vector の内容をfor文で表示するだけの例です。
#include <iostream> #include <vector> using namespace std; int main(int argc, char const* argv[]) { std::vector<int> v; v.push_back (1); v.push_back (2); v.push_back (3); for (auto x: v) { cout << x << endl; } return 0; }
コンパイル
clang++ -std=c++11 auto1.cpp -o auto1
実行例
% ./auto1 1 2 3
Range based for + auto 型の例
C++11からは、forとauto型で非常にループが簡単になります。
#include <iostream> #include <vector> using namespace std; int main(int argc, char const* argv[]) { std::vector<int> v{1,2,3}; for (auto x: v) { cout << x << endl; } return 0; }
C++11のautoが使えないケース
- 変数宣言時に初期化しない場合です。
- 引数の型にautoが使えません。
- 戻り値の型をauto型にできません。