Difference between FStringAssetReference and TAssetPtr?

They’re both used to point to unloaded assets and load them on demand, right? So what’s the actual practical difference between the two?

I can only speak for TAssetPtr but it does not automatically load unloaded assets on demand. It’s simply a pointer to an asset that “may or may not be loaded” at a given time. The asset needs to be loaded manually, via TAssetPtr.LoadSynchronous() for example, and then TAssetPtr points to the loaded object.

Sourced from https://wiki.unrealengine.com/TAssetPtr_and_Asynchronous_Asset_Loading.

As per my understanding:

TAssetPtr is a Pointer to a instance of your asset once loaded (via .Get()).
Where as FStringAssetReference is just a “string” representing your asset that you can load to get a object that you can store in “another pointer variable”.

TAssetPtr is using FStringAssetReference to hold a “non loaded ref” to your asset and will hold a weak ptr to your object once loaded.

I hope it’s clear.
Epic doc : Referencing Assets | Unreal Engine Documentation