放置されたクラス「特別会員」 - 伝達関数

A、演算子のオーバーロード

このキーワードは、ほとんど使用され、実際には非常に普通ではありませんが、このキーワードを発生し、新しい/削除クラスは、キーワード頻繁に撤回されたが全体的な状況はさらに奇妙に見えるようにすることを、まとめて表示されます。伝達関数のカスタムクラスのメンバーで見られるC ++のSTLライブラリを見てする必要があります前に、オブジェクトが(クラスならば通常は論理式で使用される)bool型に変換することができ作るために期待されています。それは撤回と機能を一緒の別のSTL :: TR1の拡張されたときに、この関数を参照してくださいするに転化しました。我々はすべて知っているように、関数は理想的なSTLのすべてをある(たとえパラメータの数が異なる)外部の統一関数ポインタの形としてパッケージ(ファンクタのクラス、関数)を呼び出すことができるもの。それが理想的なの関数であるので、ブール機能として表現することができる、彼はNULLポインタであるかどうかを判断することが最善です。
オペレータ次の2つのクラスの使用は、比較的容易に混乱し、同じように見えますが、彼らは2つの完全に異なる構文/意味構造であることに注意してくださいは、変換機能である演算子関数です。文法的な特徴キーワードオペレータの指導が開始され、最も明白なそのビューの言語学の点からは、他のタイプは、ガイドの始まりです。
4.4.7-gccの\のlibstdc ++ - v3の\含める\ tr1_impl \機能
///クラスの関数
テンプレート<_RES型名、型名... _ArgTypes>
クラスの関数<_res(_ArgTypes ...)>
:公共_Maybe_unary_or_binary_function <_RES、_ArgTypes。 ...>、
プライベート_Function_base
{
......
// [3.7.2.3]機能容量

/ **
*%の機能のラッパーが目標を持っているかどうかを判断し@brief。
*
* @return @c真この%関数オブジェクトはターゲット、含まれている場合、
それが空であるとき*や@c虚偽を。
*
*この機能は、例外をスローしません。
* /
オペレータ_Safe_bool()constは
{
IF(_M_empty())
戻り0;
他の
リターン&_Hidden_​​type :: _ M_bool。
}

// [3.7.2.4]関数呼び出し

/ **
*呼び出します@brief機能は、*この@cによって目標。
*ターゲットの結果を@returns。
* @throws bad_function_callとき@c!(ブール値)*この
*
*関数呼び出し演算子には、ターゲット関数オブジェクト呼び出し
* @cこれにより、保存されています。
* /
_RES演算子()(_ argTypesの... __args)のconst;
......
}

二つ、二つの構造のC ++構文の説明

"C ++ 11-ドラフトstarndard.pdfにおける " 第2のシンタクスを案内するための、 "機能オペレータID"と呼ばれる
オペレータ機能-ID:
オペレータOPERATOR
の一つ:OPERATOR
] [新しい新しい削除新しい新[]削除
?| - + * /%&
!= <> + == * = / =%=
!=&= | = << >> << >> = = = = =
<=> = && || + + - - > * - >
()[]
構文変換機能-IDは、であるために定義されている
変換関数-ID:
オペレータ変換方式-ID
それらは、唯一これら二つの文法構造オペレータが始まっているが、解析時に、その差は明らかです。ここからコンセプト、オペレータ機能-idとアトミック文法のユニット、その意味と通常の関数名と同じように一緒に通常の関数名、演算子と演算子と同じように理解します。直感的に言うことができる:通常の関数を表示することができた場合、関数名が「演算子+演算子」に置き換え可能ですされています。
ハリー@ tsecer:猫-n operator.function.id。




5リターンX * X;
6}
。7 INT MUL(INT X)
8 {
9リターンX * X;
10}
11};
12は
13であるINTオペレータ+(A&A、INT X CONST)
14 {
15リターンX + X;
16}
。追加INT 17(A&CONST、int型X)
18は{
19リターンX + X;
20である}
21である
22 A Aであり、
23は(INT主である)
24 {
(1)(1)25戻りA.OPERATOR * a.mul + + +演算子(,. 1)+追加(,. 1);
26}である
ハリー@ tsecer:GCC -C operator.function.id.cpp
tsecer @ハリー:
「見ることができるコードスニペット上記参照"演算子*"と全体としてオペレータ+」、および修飾されていない-ID構文単位、それらの識別子とリテラル識別子と同じレベルのより高度なタイプである、文法的に等価である、それぞれMUL対応を追加したが、語彙に異なるルールに記述する
主要な表現を:
リテラル
この
(式)
ID-表現
ラムダ式の
:ID-表現
修飾されていない-ID
修飾-ID
非修飾-ID:
識別子
オペレータ機能-ID
変換機能-ID
リテラルオペレータ-ID
〜クラス名
〜decltype指定子
テンプレート-id

三、変換関数のためのC ++の説明

ビューディレクトリの組織的な観点から、変換は、同じディレクトリ内に同じ特殊なメンバ関数およびコンストラクタ/デストラクタですが、CTOR /デストラクタ最も一般的という名前の変換値しないよりも変換を、カバーするために使用します。彼らは、彼らが実際に型宣言の使用を指導されていないことを彼の叔父が理由。コンストラクタの例には、クラス名と同じ場所によって識別され、デストラクタは「〜」の始まりによるものであり、対応する変換が「演算子」キーワードの認識の初めに必要とされます。
12の特別なメンバ関数256の
12.1コンストラクタ........................................... 。256個の
12.2一時オブジェクト......................................... 258の
12.3変換。 ............................................ 261の
12.4デストラクタに... .......................................... 264
12.5無料店。266
12.6初期化。268
12.7建設と破壊。274
12.8クラスオブジェクトのコピーと移動。277の
12.9継承コンストラクタ。284
変換関数はメンバ関数である場合、
「12.3.2変換関数」中对于转换函数的定义
変換関数(8.3.5)のタイプが「関数変換型-IDを返すないパラメーターを取っていません」。

四、クラスのメンバーのためのgccの特別な処理

ここだけのノートにあること:gccの内部転換とは、実際に変換が見落としていることを示すが、特定のクラスのデストラクタのない、本当に基本構造/メンバーの使用の後、高周波数を同時に処理CTOR /デストラクタ、です。
4.4.7-GCC \ GCC \ CP \ parser.c
静的cp_declarator *
cp_parser_direct_declarator(cp_parser *パーサー、
cp_parser_declarator_kindのdcl_kind、
INT * ctor_dtor_or_conv_p、
BOOLのmember_p)
{
...
IF(CLASS_TYPE)
{
IF(TREE_CODE(unqualified_name)== BIT_NOT_EXPR)
SFK = sfk_destructor;
他のIF(IDENTIFIER_TYPENAME_P(unqualified_name))
SFK = sfk_conversion;
他のIF(/ * NOウェイは、DECLAREのAのコンストラクタにありAPOS
AN匿名タイプのため、でもIF型の
リンケージ目的* /のためのGOT A名。
TYPE_WAS_ANONYMOUS(CLASS_TYPE! )
&& constructor_name_p(unqualified_name、
CLASS_TYPE))
{
unqualified_name = constructor_name(CLASS_TYPE)。
SFK = sfk_constructor。
}

もし(ctor_dtor_or_conv_p && SFK = sfk_none!)
* ctor_dtor_or_conv_p = -1;
}
...
}

第五に、簡単な例を使用します

この例では楽しいの機能は、オブジェクトのポインタではなく、従来のものであることに注意してください
ハリー@ tsecer:CATのfunction.cppの
書式#include <Tr1を/機能>

std :: tr1を::関数<無効()>楽しいです。

int型)(メイン
{
(楽しい!)場合は
{
123を返します。
}
0を返します。
}
:ハリー@ tsecer
ハリー@ tsecer:猫-n function.cpp
1の#include <TR1 /機能>
2
3のstd :: tr1を::関数<無効()>楽しいです。
4
5 INTメイン()
6 {
7 IF(楽しい!)
8 {
9リターン123。
10}
11リターン0。
12}
ハリー@ tsecer:G ++ -g function.cpp
tsecer @ハリー:./a.out
tsecer @ハリー:エコー$?
123
ハリー@ tsecer:gdbの./a.out
GNU GDB(GDB)のRed Hat Enterprise Linux 7.6.1-80.el7
著作権(C)2013フリーソフトウェア財団、株式会社
ライセンスGPLv3の+:GNU GPLバージョン3以降<http://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです:あなたはそれを変更して再配布は自由です。
NOの保証は、法律で認められている範囲内に、あります。「コピーSHOW」と入力
し、詳細については、「ショーの保証を」。
このGDBは、 "x86_64の-のredhat-のlinux-gnuの"として設定されました。
バグが命令を報告するために、参照してください。
<http://www.gnu.org/software/gdb/bugs/> ...
/home/harry/study/cpp.rvalue/a.out...doneからシンボルを読みます。
(GDB)7 B
ブレークポイント1 0x400604で:ファイルfunction.cpp、ライン7
(GDB)R
起動プログラム:/home/harry/study/cpp.rvalue/./a.out

function.cppのメインブレークポイント1、():7
7場合(楽しい!)
使用を別々のdebuginfosがありません:のdebuginfo-インストールのglibc-2.17-196.tl2.3.x86_64のlibgcc-4.8.5-4.el7.x86_64のlibstdc ++を-4.8.5-4.el7.x86_64
(GDB)SI
0x0000000000400609 7であれば(!楽しい)
(GDB)
のstd :: tr1を::関数<無効()> ::演算子のstd :: tr1を::関数<無効() > :: _ Hidden_​​type * /usr/include/c++/4.8.2/tr1/functionalでのstd :: tr1を::関数<無効()> :: _ Hidden_​​type :: *()constは(この= 0x400510 <_start>): 2048
2048オペレーター_Safe_bool()CONST
(GDB)のリスト
2043 * /
2044の#if __cplusplus> = 201103L
2045明示的なオペレータBOOL()constは
2046 {リターン_M_empty(!)。}
2047の#else
2048オペレータ_Safe_bool()constは
2049 {
2050 IF(_M_empty())
2051戻り0。
他2052
(GDB)SI
2048 0x000000000040070fオペレータ_Safe_bool()CONST
(GDB)
0x0000000000400712 2048演算子_Safe_bool()CONST
(GDB)
0x0000000000400716 2048演算子_Safe_bool()CONST
(GDB)
2050 IF(_M_empty())
(GDB)
0x000000000040071e 2050 IF( _M_empty())
(GDB)
0x0000000000400721 2050 IF(_M_empty())
(GDB)
のstd :: TR1 :: _ Function_base :: _ M_empty(この= 0x4007ad <__ libc_csu_init + 77>)/usr/include/c++/4.8.2/でTR1 /機能:1760
1760 BOOL _M_empty()constは{リターン_M_manager;!}
(GDB)SI
0x00000000004006c7 1760 BOOL _M_empty()constは{戻り_M_manager!。}
(GDB)P _M_manager
$ 1 =(STD :: TR1 :: _ Function_base :: _ Manager_type)0xc35f415e415d415c
(GDB)の
スタンダード:: TR1 ::関数<ボイド()> ::演算子のstd :: TR1 ::関数<ボイド() /usr/include/c++/4.8.2/tr1/functionalで> :: _ Hidden_​​type *のstd :: tr1を::関数<無効()> :: _ Hidden_​​type :: *()constは(この= 0x601060 <楽しいです>): 2051
2051リターン0;
(GDB)のリスト
!2046 {リターン_M_empty(); }
2047の#else
2048オペレータ_Safe_bool()constは
2049 {
2050 IF(_M_empty())
2051戻り0。
2052他に
2053年のリターン&_Hidden_​​type :: _ M_bool。
2054}
2055 #endifの
(GDB)SI
0x0000000000400731 2051戻り0;
(GDB)のp _M_manager
$ 2 =(STD :: TR1 :: _ Function_base :: _ Manager_type)を0x0
(GDB)

おすすめ

転載: www.cnblogs.com/tsecer/p/12558312.html