为什么缩小转换的需求存在这种差异?

Zeb*_*ish 5 c++ constructor

我对这些规则真的很困惑:

void func(float f)
{

}

struct Foo
{
    Foo(float b) {}
};
int main()
{

    short b = 1;
    
    func(b);/* WORKS FINE*/

    Foo foo{ b }; /*REQUIRES NARROWING CONVERSION FROM SHORT TO FLOAT */
    Foo foo2{ (short)b }; /* REQUIRES NARROWING CONVERSION FROM SHORT TO FLOAT */
    Foo foo3{ (short)7 }; /* WORKS FINE */
}
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是,为什么我可以使用 Short 的左值调用 func(float),但不能将其用作构造函数的参数?

我的第二个问题是,即使我们查看将short传递给构造函数,那么当我们将r值short传递给它时它也不会抱怨。为什么会这样呢?