「Cpp 型推論 auto」の版間の差分
30行目: | 30行目: | ||
cpp | cpp | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
auto x = | auto x = 42; // int型 | ||
auto y = 3.14; // double型 | |||
auto z = "Hello, World!"; // const char[14]型 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
38行目: | 40行目: | ||
cpp | cpp | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
auto | auto a = 42; // int型 | ||
auto b = 3.14; // double型 | |||
auto c = "Hello, World!"; // const char[14]型 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
46行目: | 50行目: | ||
cpp | cpp | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
auto | auto arr = {1, 2, 3}; // std::initializer_list<int>型 | ||
auto vec = std::vector<int>{1, 2, 3}; // std::vector<int>型 | |||
auto lst = {1, 3.14, "Hello"}; // std::initializer_list<std::variant<int, double, const char*>>型 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
54行目: | 60行目: | ||
cpp | cpp | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
int | int i = 42; | ||
auto & | auto& ref_i = i; // int&型 | ||
const double pi = 3.14; | |||
auto& ref_pi = pi; // const double&型 | |||
const char* str = "Hello"; | |||
auto& ref_str = str; // const char*&型 | |||
</syntaxhighlight> | |||
<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">参照の初期化 (Reference Initialization):</span> | |||
cpp | |||
<syntaxhighlight lang="cpp"> | |||
int a = 42; | |||
auto&& rvalue_ref = std::move(a); // int&&型 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
2024年1月25日 (木) 23:00時点における版
C++に戻る
本来の表記は「C++(Cpp) bool型」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。 |
※このページではC++にのみ存在する機能として、記事タイトルがC++ bool型になっています。
型推論 auto
C++11から導入されたautoによる型推論は、変数宣言時に具体的な型名の代わりにautoキーワードを指定することで、変数の型を初期化子から推論できるようになりました。例えば、以下のように、int型の変数iを初期化子0で初期化する場合、autoキーワードを使って、変数の型を推論することができます。
auto i = 0; // iはint型
autoキーワードは、配列や標準ライブラリのコンテナ、ユーザー定義のクラスに対しても使用することができます。また、autoキーワードは、関数の戻り値の型を後置する関数宣言構文でも使用されますが、その場合のautoには型推論の意味はありません。
C++の型推論による初期化子の種類は、主に以下のものがあります。
直接初期化 (Direct Initialization):
cpp
auto x = 42; // int型
auto y = 3.14; // double型
auto z = "Hello, World!"; // const char[14]型
コピー初期化 (Copy Initialization):
cpp
auto a = 42; // int型
auto b = 3.14; // double型
auto c = "Hello, World!"; // const char[14]型
リスト初期化 (List Initialization):
cpp
auto arr = {1, 2, 3}; // std::initializer_list<int>型
auto vec = std::vector<int>{1, 2, 3}; // std::vector<int>型
auto lst = {1, 3.14, "Hello"}; // std::initializer_list<std::variant<int, double, const char*>>型
参照の初期化 (Reference Initialization):
cpp
int i = 42;
auto& ref_i = i; // int&型
const double pi = 3.14;
auto& ref_pi = pi; // const double&型
const char* str = "Hello";
auto& ref_str = str; // const char*&型
参照の初期化 (Reference Initialization):
cpp
int a = 42;
auto&& rvalue_ref = std::move(a); // int&&型
これらの初期化子を使った際に、autoキーワードを使用することで型推論が行われます。型推論は、初期化子の種類によって微妙に異なる場合があります。一般的には、直接初期化やコピー初期化の場合は初期化子の型と同じ型になりますが、リスト初期化の場合や参照の初期化の場合は注意が必要です。
例えば、リスト初期化の場合は初期化子の型を見て適切な型が選ばれます。参照の初期化の場合は、参照先の型になります。
注意: autoによる型推論が明示的な型指定よりも柔軟である一方で、適切な型が推論されない場合やプログラマの意図しない型が推論される可能性もあるため、慎重に使用する必要があります。
C++に戻る