ホームページ  >  記事  >  バックエンド開発  >  C++11 の新機能である auto の使用

C++11 の新機能である auto の使用

高洛峰
高洛峰オリジナル
2017-01-23 13:48:021557ブラウズ

前書き

C++ は厳密に型指定された言語です。変数を宣言する場合は、その型を明確に記述する必要があります。ただし、実際には、式の値の型を推測することは難しく、特にテンプレート型の出現により、一部の複雑な式の戻り値の型を理解することがさらに困難になっています。この問題を解決するために、C++11 で導入された auto には、自動型推論と戻り値の占有という 2 つの主な用途があります。 C++98 で一時変数を識別するための auto のセマンティクスは、最小限かつ冗長な使用のため、C++11 では削除されました。前後の2台の標準オートは全く異なるコンセプトです。

1. 自動型推論

auto 自動型推論は、初期化式から変数のデータ型を推論するために使用されます。 auto の自動型推論により、プログラミング作業を大幅に簡素化できます。 auto の使用例をいくつか示します。

#include <vector> 
#include <map> 
  
using namespace std; 
  
int main(int argc, char *argv[], char *env[]) 
{ 
// auto a;  // 错误,没有初始化表达式,无法推断出a的类型 
// auto int a = 10; // 错误,auto临时变量的语义在C++11中已不存在, 这是旧标准的用法。 
  
 // 1. 自动帮助推导类型 
 auto a = 10; 
 auto c = &#39;A&#39;; 
 auto s("hello"); 
  
 // 2. 类型冗长 
 map<int, map<int,int> > map_; 
 map<int, map<int,int>>::const_iterator itr1 = map_.begin(); 
 const auto itr2 = map_.begin(); 
 auto ptr = []() 
 { 
 std::cout << "hello world" << std::endl; 
 }; 
  
 return 0; 
}; 
  
// 3. 使用模板技术时,如果某个变量的类型依赖于模板参数, 
// 不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。 
template <class T, class U> 
void Multiply(T t, U u) 
{ 
 auto v = t * u; 
}

2. 戻り値の占有率


3. 使用上の注意事項

1. auto

template <typename T1, typename T2> 
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2) 
{ 
 return t1+t2; 
} 
auto v = compose(2, 3.14); // v&#39;s type is double

を変更するには、valatile、ポインタ (*)、参照 (&)、右辺値参照 (&&) を使用できます。

2. auto で宣言された変数は初期化する必要があります

auto k = 5;
auto* pK = new auto(k);
auto** ppK = new auto(&k);
const auto n = 6;

3. Auto は他の型と組み合わせて使用​​することはできません

4. 関数およびテンプレートパラメータは auto

auto m; // m should be intialized

として宣言できません

5. auto を使用した変数、式は初期化する必要があります

6. auto は独自の型ではなくプレースホルダーであると思います。そのため、型変換などには使用できません。 sizeof や typeid などの他の操作

auto int p; // 这是旧auto的做法。

7. auto シーケンスで定義された変数は常に同じ型に推定される必要があります

8. Auto は自動的に CV 修飾子に推定されません。 constant & volatile 修飾子)、参照型として宣言されていない限り

void MyFunction(auto parameter){} // no auto as method argument
  
template<auto T> // utter nonsense - not allowed
void Fun(T t){}

9. auto は、参照として宣言されていない限り、配列へのポインタに縮退します

int* p = new auto(0); //fine
int* pp = new auto(); // should be initialized
  
auto x = new auto(); // Hmmm ... no intializer
  
auto* y = new auto(9); // Fine. Here y is a int*
auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)

まとめ

以上ですこの記事では、この記事の内容が C++ の学習または使用に役立つことを願っています。ご質問がある場合は、メッセージを残して連絡してください。

C++11 の新機能である auto の使用に関するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。