int* b = new int(40);
int c = *(int *)b;
The above cast is working fine.
But similar casting is not working for function pointers
void abc(int a){
cout<<a<<endl;
}
std::function<void(int)> callback = *(std::function<void(int)>*)abc; // this cast is not working
What is wrong in the above piece of code?
CodePudding user response:
You cast b to the same type that it already has. This results in a static cast, which doesn't change the value. The type of b is int* and you cast to int*.
You cast abc to an entirely different type. And since the target type is unrelated, this resulst in a reinterpret cast, and accessing the pointed object through the reinterpreted pointer (which is a problem since it points to a function and not an object at all) results in undefined behaviour. The type of abc is void(int) which is a function type and it implicitly decays to void(*)(int) which is a pointer to function type. You cast it to std::function<void(int)>* which is a pointer to object type, where the object type is of the class type that was instantiated from the class template std::function.
What is wrong in the above piece of code?
- Using C style cast is wrong. Don't do it.
- Reinterpret casting pointer to an unrelated type is wrong.
std::function<...>*is not a pointer to function.std::functionis not a function. It's a class template for a function wrapper.
CodePudding user response:
std::function<void(int)> is not a function. It is a class with an operator(). It has a constructor that you need to invoke to create an instance of that class. For example like this:
std::function<void(int)> callback = abc;
On the other hand, here:
int* b = new int(40);
int c = *(int *)b;
new int(40) does create an int object and b is a pointer to that object. The cast (int*)b doesn't do anything, because b is already a int* that you can dereference to assign the value of the int to c.
I tried to keep it simple, for a more accurate explanation of what is actually happening in your code I refer you to this answer: https://stackoverflow.com/a/70166958/4117728.
