Forget about using std::bind
for a minute and just try the direct approach:
C<F> a;
C<G> b;
R<H> r{H{}, H{}};
a(b(r));
This won't even compile, so there's no way the bind
version will!
b(r)
isn't valid because of an access violation, and if you fix that a(b(r))
fails because you try to bind a temporary to a non-const lvalue-reference