C++ primer中 关于摘引的一点不理解

C++ primer中 关于引用的一点不理解
最近,又把C++ primer拿出来复习一遍,但是看到 有关于函数的返回值返回引用上,突然有了一点疑问

一般来说,函数的返回值是不返回局部变量的引用的,因为函数调用结束之后,函数分配给局部变量的内存空间会被释放,因此返回局部变量的引用就会指向一块不确定的内存

但是,我看到了下边这样的代码:

const string &shorterString(const string &s1,const string &s2)
      {
             return s1.size()<s2.size()?s1:s2;
      }


这里返回的s1 和s2不也是局部变量的引用么?为什么这个是被认可是对的

但是

const string &mainip(const string &s)
      {
             string ret=s;
             return ret;
      }


上述的第二段代码,如果改成   return s; 就会被认为是正确的?

我始终想不明白这个问题,有没有人能给小弟解释一下这个的原因
------解决方案--------------------
返回的是实参的引用,实参是传进来的,相对来说不是局部的