GetBoneTransform/GetSocketTransform results inconsistent between C++ and BP implementations. Why?

I need to know the local forward/right/up vectors of my creature’s feet bones at all times. So naturally I assumed GetBoneTransform/GetSocketTransform would be my solution. However, I can only achieve this in BP via the identically named nodes because they’re calling different functions than the C++ implementations. I haven’t yet spent enough time dissecting the engine’s API to understand why or what the intended purpose of this inconsistency is.

So in the BP implementation, for example, the forward vectors are always pointing towards that component’s local forward regardless of how the actor is oriented. Yet the C++ versions seem to be in world space, i.e. they will always point in the same world direction regardless of my actor’s orientation. Why? This happens with both GetBoneTransform and GetSocketTransform.

I’m using RTS_World in both cases. Switching to RTS_Component on the BP version yields the results I don’t want, described in the last paragraph. Switching to RTS_Component in the C++ version yields the same result (i.e. it behaves identically to using RTS_World in C++.) I feel like this is either a bug or there’s a gap in my understanding here.

I ultimately wont be using blueprints anywhere in this particular custom character controller, so I need to understand why this is happening and how to properly achieve the results I’m looking for. Can someone help please?

For the sake of clarity, here’s my code:

const FTransform foot = GetMesh()->GetBoneTransform(FName(Feet[i]), RTS_World); //same result with RTS_Component
const FVector location = foot.GetLocation();
const FRotator rotator = foot.Rotator();
DrawDebugLine(GetWorld(), location, location + rotator.Vector().ForwardVector * 20, FColor(255, 0, 0, 255));
DrawDebugLine(GetWorld(), location, location + rotator.Vector().RightVector * 20, FColor(0, 255, 0, 255));
DrawDebugLine(GetWorld(), location, location + rotator.Vector().UpVector * 20, FColor(0, 0, 255, 255));

Again, this fails, it points to a fixed location in world space regardless of actor orientation. The BP doesn’t fail, here’s how I’m doing it there:

I don’t understand the difference.