
I have a question about the following code: typedef void(intArrayParamFunc)(int[]); typedef void(intPtrParamFunc)(int*); BOOST_STATIC_ASSERT((boost::is_same<intArrayParamFunc,intPtrParamFunc>::value)); BOOST_STATIC_ASSERT((boost::is_same<int*,int[]>::value)); cout << typeid(intArrayParamFunc).name() << endl; cout << typeid(intPtrParamFunc).name() << endl; cout << typeid(int*).name() << endl; cout << typeid(int[]).name() << endl; The first assert compiles but the second fails, which means that boost::is_same<> thinks that int* and int[] are different, but void(int[]) and void(int*) are the same. Why is this? The typeids print out the following: void __cdecl(int * const) void __cdecl(int *) int * int [0] I'm using Visual Studio 2008. I notice that typeid tells me that intArrayParamFunc is void(int* const). So why does boost::is_same<> compare them equal? Surely void(int* const) should not be the same type as void(int*). Unless this is just some obscure language subtlety I'm not aware of. So is this a bug in boost::is_same<>, a bug in my compiler, or no bugs at all and everything is working perfectly?