「auto」の版間の差分

提供: C++入門
移動: 案内検索
(関連項目)
 
(同じ利用者による、間の1版が非表示)
行1: 行1:
[[auto]] とは、[[C++11]]で追加された型推論です。
+
[[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]]
行64: 行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からは、forauto型で非常にループが簡単になります。

#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型にできません。

エラー

関連項目