The flow field is indeed a grid of the same size.
However, grid_sample function is a sampler that maps pixels in the input argument according to their corresponding position in the grid argument. You need a neutral grid as the base sampler to map an image to itself, and the flow field comes on top of that and indicates how each pixel has moved differently.
Suppose the flow is zero and you want to map an image to itself, then in that case, using an all-zero grid would produce a non-sense output.
You can try both with flow-only, and with flow+mesh{[-1,1]} and compare the results.
Just note that in my case, the image input argument needed to be normalized between [0,1] rather than [0,255].