2016-11-08 3 views
4

以下のコードスニペットから、私は関数のアドレスを取得しています。なぜですか?関数ポインタアドレスがC++のbool型で印刷されているのはなぜですか?

#include<iostream> 
using namespace std; 
int add(int x, int y) 
{ 
    int z; 
    z = x+y; 
    cout<<"Ans:"<<z<<endl; 
} 

int main() 
{ 
    int a=10, b= 10; 
    int (*func_ptr) (int,int); 
    func_ptr = &add; 
    cout<<"The address of function add()is :"<<func_ptr<<endl; 
    (*func_ptr) (a,b); 
} 
+0

関数ポインタは、ブール値に暗黙的にキャストされます。最近同様の質問がありました。 – stefaanv

+1

[coutで関数ポインタを印刷するには?](http://stackoverflow.com/questions/2064692/how-to-print-function-pointers-with-cout)の可能な複製 – stefaanv

答えて

8

関数ポインタはデータポインタに変換できません。 void*変数に変数を代入しようとすると、コンパイラエラーが発生します。しかし、暗黙のうちにboolに変換可能です!

operator<<の場合、boolのオーバーロードがconst void*よりも優先されます。

あなたが望むオーバーロードを強制するには、非常に強力なC++キャストを使用する必要があります。ほとんどは静的型情報を完全に無視します。

#include<iostream> 
using namespace std; 
int add(int x, int y) 
{ 
    int z; 
    z = x+y; 
    cout<<"Ans:"<<z<<endl; 
} 

int main() 
{ 
    int a=10, b= 10; 
    int (*func_ptr) (int,int); 
    func_ptr = &add; 
    cout<<"The address of function add()is :"<< reinterpret_cast<void*>(func_ptr) <<endl; 
    (*func_ptr) (a,b); 
} 

データポインタとして関数ポインタをキャストし、処理することのみを条件付きで(C++標準の観点から)に支持されていることに留意されたいです。それを同じ関数ポインタにキャストする以外に何かを使用すると、実装固有の結果が得られます。これはコンパイラ間で非常に大きくなります。

3

使用オーバーロードは、あなたの関数ポインタがNULLではないよう1印刷し

ostream& ostream::operator<< (bool val); 

です。

関連する問題