「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からは、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型にできません。

エラー

関連項目