a, b, and c make sense, but what happens to d?

Actually the special case is c here.
a and b are Parameters because you created them.
d is  just a Tensor with a grad_fn: it is not a leaf anymore because it was created by a differentiable op
c is the special case because the Tensor is already on the cpu, then .to('cpu') is doing nothing and you still get the Parameter back.