第1章新しいC ++言語
1.2左右の値値
左側値:変数は式の終わりがまだ存在した後、シンボルはアドレス&取得したアドレスを取ることができ、ストアデータ、実メモリ・アドレスに使用されてもよいです。
右の値:ライフサイクルの終わりに匿名の一時変数、式が終了し、村はシンボルのアドレスを取る&アドレスを取得できないデータを格納することはできません。
[ルート@ 192 C ++ 11]#猫のlrdemo.cpp
#include <iostreamの>
使用して名前空間STD;
int型のmain()
{
int型X = 0;
COUT << "X:" X << << ENDL;
INT&++ * P = X;
COUT << "X:" < <X << ENDL;
COUT << "&X:" << ENDL <<&X、
COUT << "P" P << << ENDL;
++ = 10 X;
COUT << "X:" X << ENDL <<;
オペランドの左辺値単項必要に応じて、「&」:; //&P = X + ++ //ポスト操作は、一時的なオブジェクトを返す、またはアドレスの割り当て、正しい値、コンパイルエラー、エラー情報の誤りを取ることができない。
リターンを0 ;
}
[C ++ルート11 @ 192。]#G ++ lrdemo.cpp -o lrdemo -std = C ++ 11。
[C ++ルート11 @ 192。] ./lrdemo#
X:0
X :. 1
およびX:0x7ffc14f61664
P:0x7ffc14f61664
X :10の
1.2.2右辺値参照
「T &&」元の「T&」は左基準値を示し、一方、右辺値参照フォームを示すを使用してC ++ 11/14。右の参照オブジェクトの値は、オブジェクトが明示的に正しい値としてマークされていることは、この手段は、転送を最適化することができます。しかし、また、それに一時的な名前を追加したのと同じでは、ライフサイクルが延長された、式の最後に消えることはありませんが、引用された右の値が一緒にバインドされて。
"X:" << X <<てendl; 裁判所未満<< "R4:" << R4 <<てendl; 0を返します。} [ルート@ 192 C ++ 11]#G ++ rrefdemo.cpp -o rrefdemo -std = C ++ 11
[C ++ルート11 @ 192。] ./rrefdemo#
X 0
X 1 :.
R1 :. 1
X:2
R2 :. 1
X :. 3
R3:2
X :. 4
R4 :. 3
未知のタイプの一般的なプログラミングで動作する必要がありますこの新たな規制にするC ++ 11/14 -折りたたみ参照:動作基準の型への参照をTRは、関数パラメータは、総Tの形で使用される場合は、右動作基準は、したがって変更されず、T&が、残っている&&元の型をそのまま維持します。
1.2.3移動セマンティクス
C ++ 11/14であればクラスが実装としてこれらの特別な機能は、転送セマンティクスで右構成により物体のゼロコスト値とすることができ、T &&コンストラクタ関数の転送及び転送のために割り当てられた新しい標準パラメータークラスタイプを追加します。限り、オブジェクトが右のために引用された移動()タグ値であるとして、それは資源のいかなる損失、ディープコピーのコストを心配する必要のなくなっずに転送することができます。
[C ++ルート11 @ 192。]#猫movedemo.cpp用
の#include <iostreamの>
使用して名前空間STD;
クラス可動//実装クラスのコンストラクタと伝達関数の割り当ての転送
{
プライベート:
int型X;
公共:
可動(){}
可動(可動&&他の)//移動コンストラクタ
{スワップ(X、other.x);}
可動&演算子=(&& OTHER可動)//割り当て伝達関数
{
スワップ(X、other.x);
戻り*この;
}
静的可動()を作成
{
; //は、スタック上のオブジェクトを作成する可動OBJを
、すなわち右の値の原因はセマンティクスを動かす、//は、一時オブジェクトを返し、戻りOBJ
}
;}
(INTメイン)
{
オブジェクト作成する//デフォルトコンストラクタ、可動M1
可動をM2(移動(M1)); // コンストラクタコール転送は、転送されM1
可動M3 =可動::作成() ; // コール転送機能割り当て
戻り0;
}
。[C ++ルート11 @ 192]#G ++ movedemo.cpp -o movedemo -std = C ++ 11
[C +ルート@ 192 11]#./movedemo
パーフェクト転送1.2.4
標準ヘッダ<ユーティリティ>前方の機能は(もあります)、ときジェネリックプログラミングを転送するための完璧な、あなたはそのまま他の関数を楽しみに関数パラメータを置くことができます。
[ルート@ 192 C ++ 11]#猫のforwarddemo.cpp
する#include <iostreamの>
名前空間stdを使用。
空のチェック(INT&)
{
coutの<< "左辺値" <<てendl;
}
ボイド検査(INT &&)
{
COUT << "右辺値" << ENDL。
}
テンプレート<型名T>
ボイドプリント(T && V)
{
チェック(フォワード<T>(V))。
}
int型のmain()
{
int型のx = 10。
プリント(X)。
プリント(移動(X));
0を返します。
}
[192 C ++ 11 @ルート]#G ++ forwarddemo.cpp -o forwarddemo -std = C ++ 11
[192 C ++ 11 @ルート]#./forwarddemo
左辺
右辺値
パーフェクト関数のパラメータを転送するときに使用するには、現状を維持する唯一の方法を入力し、T &&として宣言する必要があります。
1.3自動型推論
1.3.1オート
自動割り当て式は、変数の宣言で使用され、自動的にコンパイル時にタイプの式を導き出すことができます。
注意が必要な地域での自動車の使用:
(導出のための発現がなかったため)(1)自動割り当てステートメントのみ直接変数を宣言しない、型推論に使用することができます。
(2)自動常に推測値型、非参照。
(3)自動CONST /揮発可能/&/ *新しいタイプを取得するために、同様に修飾されました。
(4)自動&&常に参照型を推論します。
C ++オート14も自動的型導出関数を返すために使用されてもよいです。そのようなものとして
オートFUNC(INT X){リターンX * X;}
[C ++ルート11 @ 192。]#猫autodemo.cpp用
の#include <iostreamの>
する#include <string>に
用いた名前空間STD;
int型のmain()
{
int型X = 0;
ロングY = 100のconst;
揮発性ストリングS(「ワンパンチ「);
オートA1 = X ++; //値のint型
自動車&A2 = X; //参照型&int型
オートA3 = Y * Y; //値型ロング
オート&A4 = Yは; //参照型ロング&constの
自動A5 =移動(Y); //値型ロング
オート&& A6 =移動(Y); //参照型ロング&CONST
CONST = X + XオートA7; //定数型int CONST
オート* A8 =&Y; // CONST長い*、自動車自体が値型の導出する
自動&& A9 = S; //参照型文字列&揮発
//オートA10; //割り当てがないと、コンパイラはエラーに誤った情報を与えられて導き出すことはできません初期化します。「オートA10」の宣言には初期化子がない
リターン0;
}
[ルート@ 192 C ++ 11]#G ++ autodemo.cpp -o autodemo -std = C ++ 11
1.3.2 decltype
関数呼び出しのようなdecltypeフォーム:
decltype(表現)
推論または参照タイプを挙げることができるようにdecltypeが自動割り当てとして使用することができ、型がより正確な性質および発現結果カテゴリの式に応じて制御することができます。
必要性の注意その詳細のdecltypeの使用:
発現を得る形態(1)decltype(e)はタイプの値を評価します
フォームautoに同様の参照型に発現評価さを得るために、(2)decltype((E))、&&。
[ルート@ localhostのC ++ 11]#猫decltypedemo.cpp
する#include <iostreamの>
する#include <ベクトル>
の#include <アルゴリズム>
名前空間STDを使用して、
decltype(は0.0f)FUNC(decltype( 0L)X)// 関数の戻り値とパラメータの宣言のために
{
リターンX * X;
}
テンプレート<型名T>クラスデモ{}。
INTのmain()
{
int型X = 0;
CONSTロングY = 100;
decltype(X)D1 = X; // int型
(X)&D2 = X decltype; // int型&
decltype(&X)D3 =&X ; // * INTタイプ
decltype(X + Y)= X + Y D4; //長を入力
decltype(Y)= Y&のD5と、// CONSTロング・タイプ
decltype(以下<整数>() )ファンクタであり; //は、 関数オブジェクト宣言
decltypeのtypedef(FUNC)* func_ptrを; //は単に関数ポインタ型を定義する
ベクトル<整数> V;
decltype(V)::イテレータITER; // Vを計算するの種類、及びその後イテレータのいずれかのタイプ
デモ<decltype(V)> OBJ ; // テンプレートパラメータリストdecltypeのに使用される
戻り0;
}
[C ++ 11ルート@ localhostの]#G ++ decltypedemo.cpp -o decltypedemo -std = C ++ 11。
Decltype次の例では、差(E)およびdecltype((e)参照)のを示し
[ルート@ localhostのC ++ 11]#猫のdecltypedemo1.cpp
書式#include <iostreamの>
名前空間stdを使用。
メインint型()
{
構造体デモ{int型のx = 0;};
自動* P =新しいデモ揮発性。
decltype(P-> X)D5 = 42; // int型の値として導出さ
裁判所未満<< "D5:" << D5 <<てendl;
裁判所未満<< "P-> X:" << P-> X <<てendl;
decltype((P-> X))D6 = P-> X; //派生基準タイプ揮発性INT&
裁判所未満<< "D6:" << D6 <<てendl;
裁判所未満<< "P-> X:" << P-> X <<てendl;
// decltype(P-> X)&D7 = P-> X; //エラー、INT&タイプが一致しない場合、エラーメッセージがエラーである: '揮発性INT' 廃棄修飾子に結合タイプの参照 'INT&'
// coutの<< "D7:" << D6 <<てendl;
0を返します。
}
[ルート@ localhostのC ++ 11]#G ++ decltypedemo1.cpp -o decltypedemo1 -std = C ++ 11
[ルート@ localhostのC ++ 11]#./decltypedemo1
D5:42
p型> X:0
D6:0
p型> X:0