Pointers are references that can be null. References themselves can't be null*. That's one of the strengths and guarantees* of references.
*Normally. You can cram an address of 0x00 into a reference's memory, but you shouldn't. It defeats the point of using a reference over a pointer.
Some people use a wrapper class called optional<> for that. Boost has an implementation, and C++ will likely get a standard library class like that, but that's still a "maybe" and way off in 2017.
If your object type has some concept of being null, empty, or invalid, you can return a reference to an invalid dummy member variable for invalid returns, but I only recommend you do that if you're returning const references or returning by value.
For example, if the function returns strings or std vectors, you can return an empty string or vector on failure, when it makes sense. But even this isn't the best idea, because you still don't know if the function returned an empty string because of failure, or an empty string because of success.
What I do in this situation, is I pass in the "fallback result" as the final parameter:
const std::string &GetSomething(const std::string &key, const std::string &fallback)
{
if(...doesn't exist...) return fallback;
return stuff[key];
}
This is for cases where failing to find a result is not considered an error. If it is actually an error, you want the caller to somehow be able to be informed about that, so you should at least be able to pass in an optional boolean pointer to set to true on error.