メンバ関数ポインタ同士の比較
二つのメンバ関数ポインタ型変数が等しいかどうかを比較する処理を作ってたんですが、g++ と Visual C++ で一部違った処理になることを発見しました。
下に書いたプログラムを実行すると…
#include <cstdio>
class Test{
public:
void aaa(void){ printf("a");}
void bbb(void){ printf("a");}
};
using namespace std;
int main(void){
typedef void (Test::*func_type)(void);
func_type a = &Test::aaa, b = &Test::bbb;
printf("%d\n", a == b);
}
g++ では 0 が、 VC++ (13.10.3077 と 14.00.50727.42 で試しました) では 1が帰ってきます。
VC++では Test::aaa と Test::bbb の内容が一緒のためにメンバ関数の実体を一つしか用意してない
のかもしれません。しかし、下の例のように普通の関数の場合は、
void gaaa(void){ printf("a");}
void gbbb(void){ printf("a");}
using namespace std;
int main(void){
typedef void (*func_type)(void);
func_type a = &gaaa, b = &gbbb;
printf("%d\n", a == b);
}
どちらも 0 になるみたいです。
下に書いたプログラムを実行すると…
#include <cstdio>
class Test{
public:
void aaa(void){ printf("a");}
void bbb(void){ printf("a");}
};
using namespace std;
int main(void){
typedef void (Test::*func_type)(void);
func_type a = &Test::aaa, b = &Test::bbb;
printf("%d\n", a == b);
}
g++ では 0 が、 VC++ (13.10.3077 と 14.00.50727.42 で試しました) では 1が帰ってきます。
VC++では Test::aaa と Test::bbb の内容が一緒のためにメンバ関数の実体を一つしか用意してない
のかもしれません。しかし、下の例のように普通の関数の場合は、
void gaaa(void){ printf("a");}
void gbbb(void){ printf("a");}
using namespace std;
int main(void){
typedef void (*func_type)(void);
func_type a = &gaaa, b = &gbbb;
printf("%d\n", a == b);
}
どちらも 0 になるみたいです。