ホームページ バックエンド開発 C#.Net チュートリアル C++11 の新機能における auto と decltype の違いと関連性

C++11 の新機能における auto と decltype の違いと関連性

Jan 23, 2017 pm 02:34 PM

C++11 の新機能における auto と decltype の違いと関係

1. auto の概要

プログラミングするとき、式の値を変数に渡す必要があることを明確に理解する必要があります。変数を宣言するときの変数の型。ただし、これを行うのは簡単ではなく (特にテンプレートの場合)、まったく不可能な場合もあります。この問題を解決するために、新しい C++11 標準では auto 型指定子が導入されており、これによりコンパイラが式の型を分析できるようになります。特定の型指定子 (int など) にのみ対応するオリジナルのものとは異なります。 auto を使用すると、コンパイラは初期値を通じて型推論を実行できます。これにより、定義された変数の型が取得されるため、auto で定義された変数は初期値を持つ必要があります。

//由val_1 和val_2相加的结果可以推断出item的类型
auto item = val_1 + val_2;//item 类型初始化为val_1 + val_2相加后的类型,值为val_1+val_2相加的值。
ログイン後にコピー

ここでの項目の型は、コンパイル プロセス中に val_1 と val_2 の型を追加することによってコンパイラーによって計算されます。 val_1(int) + val_2(double) の場合、項目の型はすべての変数の初期の基本データ型が同じである必要があります。ここでは、データ型と型修飾子を必ず区別してください。 !

int i = 3;
auto a = i,&b = i,*c = &i;//正确: a初始化为i的副本,b初始化为i的引用,c为i的指针.
auto sz = 0, pi = 3.14;//错误,两个变量的类型不一样。
ログイン後にコピー

コンパイラーによって推論された auto 型は、初期値の型とまったく同じではない場合があります。コンパイラーは、初期化ルールとの一貫性を高めるために、結果の型を適切に変更します。

​​​​​​​​​​​​​​​​​この時点で、コンパイラは参照オブジェクトのタイプを自動のタイプとして使用します。 12値が定数へのポインターである場合:

int i = 0 ,&r = i;//定义一个整数i,并且定义r为i的应用.
auto a = r; //这里的a为为一个整数,其值跟此时的i一样.
ログイン後にコピー

‐ '' 's — – – spen off-‐to ‐‐‐‐‐ ‐ to be まで、初期化規則が適用されます (参照宣言に使用される const はすべて基礎となる const です):

int i = 0;
const int ci = i, &cr = ci; //ci 为整数常量,cr 为整数常量引用 
auto a = ci;   // a 为一个整数, 顶层const被忽略
auto b = cr;   // b 为一个整数,顶层const被忽略
auto c = &ci;  // c 为一个整数指针.
auto d = &cr;  // d 为一个指向整数常量的指针(对常量对象区地址是那么const会变成底层const)
ログイン後にコピー

2. decltype の概要

時々、この状況に遭遇することがあります。式から変数の型を推測して定義を推測したいと考えていますが、式の値で変数を初期化する必要はありません。関数の戻り値の型が式の値の型である可能性もあります。このような場合、auto は無力であるため、C++11 では、オペランドのデータ型を選択して返すために使用される 2 番目の型指定子 decltype が導入されています。このプロセス中、コンパイラは式を分析してその型を取得するだけで、式の値を実際に計算することはありません。

const auto f = ci;
ログイン後にコピー

ここで、コンパイラは実際に f 関数を呼び出しませんが、f 関数の戻り値を定義された型の sum として分析します。

基本的に、decltype の機能は auto の機能と非常に似ているので、一つずつリストすることはしません。 decltype のもう 1 つの用途は、C++11 で導入された postfix 戻り型です。

3。

auto &g = ci; //g是一个整数常量引用,绑定到ci。
auto &h = 42; // 错误:非常量引用的初始值必须为左值。
const auto &j = 42; //正确:常量引用可以绑定到字面值。
ログイン後にコピー
c Decltype にも注目すべき箇所がいくつかあります。次のコードを見てみましょう:

decltype(f()) sum = x;// sum的类型就是函数f的返回值类型。
ログイン後にコピー

式の内容が参照演算を解決するものである場合、decltype は参照型を取得します。ご存知のとおり、ポインターを逆参照すると、ポインターが指すオブジェクトを取得でき、このオブジェクトに値を割り当てることもできます。したがって、decltype(*p) の結果の型は int&.

decltype と auto のもう 1 つの重要な違いは、decltype の結果の型が式の形式と密接に関連していることです。特に注意が必要な場合があります。decltype で使用される式では、変数名に括弧が追加されている場合、取得される型が括弧なしの場合と異なる場合があります。 decltype で括弧なしで変数を使用した場合、結果は変数の型になります。ただし、この変数に 1 つ以上の括弧の層を追加すると、コンパイラーはこの変数を式として扱います。この変数は左辺値として使用できる特別な式であるため、そのような decltype は参照型を返します。


这里再指出一个需要注意的地方就是 = 赋值运算符返回的是左值的引用。换句话意思就是说 decltype(i = b) 返回类型为 i 类型的引用。仔细看下面这段代码:

int main()
{
  int i = 42;
  
  decltype(i = 41) x = i;
  
  auto y = i;
  
  auto& z = i;
  
  printf("i x y z 此时为: %d %d %d %d\n", i,x,y,z);
  
  i--;
  
  printf("i x y z 此时为: %d %d %d %d\n", i, x, y, z);
  
  x--;
  
  printf("i x y z 此时为: %d %d %d %d\n", i, x, y, z);
  
  y--;
  
  printf("i x y z 此时为: %d %d %d %d\n", i, x, y, z);
  
  z--;
  
  printf("i x y z 此时为: %d %d %d %d\n", i, x, y, z);
  
  return 0;
}
ログイン後にコピー


运行结果为:

i x y z 此时为: 42 42 42 42
i x y z 此时为: 41 41 42 41
i x y z 此时为: 40 40 42 40
i x y z 此时为: 40 40 41 40
i x y z 此时为: 39 39 41 39
ログイン後にコピー

   

     由上面的代码和运行结果可以看出来,1.decltype(i = 41)中的赋值语句并没有真正的运行。2. decltype(i = 41)返回的其实是int&,也就是说x 其实是 i 的引用。

了解了auto 和 decltype后,以后在使用的过程中一定要分清两者的区别,防止在定义的时候产生const 与非const 以及引用 与非引用 的差别!!

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多C++11新特性中auto 和 decltype 区别和联系相关文章请关注PHP中文网!

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語で特殊文字を処理する方法 C言語で特殊文字を処理する方法 Apr 03, 2025 pm 03:18 PM

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語でさまざまなシンボルを使用する方法 C言語でさまざまなシンボルを使用する方法 Apr 03, 2025 pm 04:48 PM

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語のcharとwchar_tの違い C言語のcharとwchar_tの違い Apr 03, 2025 pm 03:09 PM

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語でCharを変換する方法 C言語でCharを変換する方法 Apr 03, 2025 pm 03:21 PM

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語でchar配列の使用方法 C言語でchar配列の使用方法 Apr 03, 2025 pm 03:24 PM

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

See all articles