「auto」の版間の差分
提供: C++入門
(同じ利用者による、間の2版が非表示) | |||
行1: | 行1: | ||
− | [[auto]] | + | [[C++]]の[[auto]]型とは、[[C++11]]で追加された型推論です。コンパイル時に型を推測し、適切な型として扱ってくれます。 |
'''読み方''' | '''読み方''' | ||
− | ;[[auto]]: | + | ;[[auto]]:おーと |
__TOC__ | __TOC__ | ||
== 概要 == | == 概要 == | ||
+ | [[auto]]型を使用するとコードが簡単に書けるようになります。[[イテレータ]]のコードが非常に単純になります。さらに Range based [[for]]を利用することにより、さらにコードは簡素になります。 | ||
+ | |||
これは、[[イテレータ]]の例です。ループを書くために、たくさん書かないといけません。 | これは、[[イテレータ]]の例です。ループを書くために、たくさん書かないといけません。 | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
行20: | 行22: | ||
; | ; | ||
} | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == auto型とポインタ、参照などの扱い == | ||
+ | auto型の型推論は、以下のように扱われます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | int a = 123; | ||
+ | auto* p = &a; // int* p = &a; | ||
+ | auto& r = a; // int& r = a; | ||
+ | const auto& c = a; // const int& c = a; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行59: | 行70: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == Range based for + auto 型の例 == | ||
+ | [[C++11]]からは、[[for]]と[[auto]]型で非常にループが簡単になります。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == C++11のautoが使えないケース == | ||
+ | * 変数宣言時に初期化しない場合です。 | ||
+ | * 引数の型に[[auto]]が使えません。 | ||
+ | * 戻り値の型を[[auto]]型にできません。 | ||
+ | == エラー == | ||
+ | * [[clang++のエラー error: 'auto' not allowed in function prototype]] | ||
== 関連項目 == | == 関連項目 == | ||
* [[C++11]] | * [[C++11]] | ||
* [[for]] | * [[for]] | ||
+ | * [[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型にできません。