The following testcase demonstrates the issue:
#include <stdio.h>
#include <functional>
struct X {};
void foo(int&& a1, void* expected)
{
fprintf(stderr, "\t&a1 = %p [%s]\n", &a1, ((&a1 == expected) ? "true" : "false"));
}
void foo(X&& a1, void* expected)
{
fprintf(stderr, "\t&a1 = %p [%s]\n", &a1, ((&a1 == expected) ? "true" : "false"));
}
int main(int argc, char* argv[])
{
{
int a1 = 1;
fprintf(stderr, "&a1 = %p\n", &a1);
fprintf(stderr, "primitive, direct:\n");
foo(std::move(a1), &a1);
fprintf(stderr, "primitive, function pointer:\n");
typedef void(*func_ptr)(int&&, void*);
func_ptr fp = foo;
fp(std::move(a1), &a1);
}
{
X a1;
fprintf(stderr, "&a1 = %p\n", &a1);
fprintf(stderr, "UDT, direct:\n");
foo(std::move(a1), &a1);
fprintf(stderr, "UDT, function pointer:\n");
typedef void(*func_ptr)(X&&, void*);
func_ptr fp = foo;
fp(std::move(a1), &a1);
}
}
Compile with:
cl.exe <cppfile>
&a1 = 0031F7B8
primitive, direct:
&a1 = 0031F7B8 [true]
primitive, function pointer:
&a1 = 0031F7B4 [false]
&a1 = 0031F7BF
UDT, direct:
&a1 = 0031F7BF [true]
UDT, function pointer:
&a1 = 0031F7BF [true]