形参为引用,为创建临时对象吗?该如何处理

形参为引用,为创建临时对象吗?
class   Person
{
public:
        Person(string   nam)   :   name(nam)
        {};
        string   Getname()   const;
        string   Getaddr()   const;
private:
        string   name;
        string   addr;
};

void   f(const   Person   &p1)
{
        cout   < <   p1.Getname();
        cout   < <   p1.Getaddr();
}

定义了一个Person类,和一个f函数,main函数代码如下:

int   main()
{
        string   name   =   "hello   world ";

        f(name);
     
        return   0;
}

照理说f(name)的形参是Person类的引用,应该不会创建临时对象,但是程序可以执行,并输入“helloworld”,说明调用了构造函数,并创建了临时对象。

我觉得调用构造函数的条件得有临时对象,但是这里又是个引用,前后矛盾,求高手解释。

------解决方案--------------------
没啥矛盾的,你输入的是string引用,函数f要的是Person引用,而Person又有String参数的构造函数,就给你创建了一个Person对象,保证满足函数f的参数类型正确
------解决方案--------------------
void f(const Person &p1) 
形参是person引用
你实参却是string
这里发生了 string到Person 的隐式转换。 自然会有一次构造发生。

------解决方案--------------------
楼上两位高手说的很清楚了,形参既然是Person的引用,你实参至少给人家一个Person的对象撒。
人家要雪糕,你给了一块钱,人家只好拿着这一块钱自己去买了。