Note that the only reason this requires C++ is for the operator signature syntactic sugar.

Update: Didn't need the explicit selfRV construction.

#include <assert.h>
#include <stdio.h>

struct selfRV {
    typedef struct selfRV (*selfSignature)();
    selfRV(selfSignature ptr) : _ptr(ptr) { }
    operator selfSignature() const { return _ptr; }
private:
    selfSignature _ptr;
};

selfRV self() {
    return self;
}

int main() {
    puts(self == self()()()()()()()
         ? "works"
         : "doesn't work");
    return 0;
}