It is the argument itself that would be a problem. You're confusion is a perfect example of why such code makes no sense. You're implementing the copy constructor in pass-by-value semantics, which in theory implements the constructor in terms of itself. IOW, you're implementing a copy constructor that relies on another copy constructor for the exact same class, which is dubious.

So by design a copy constructor can only be something like

foo(const foo &rhs);

The types would not be different, unless C++ didn't use references anymore. If that were the case, well, I wonder if we really would depend on another pass-by-reference type, like the humble pointer.