为何f(const T&)可以接受值参数而f(T&)不能

为什么f(const T&)可以接受值参数而f(T&)不能?

struct M{};
void f(M&){}
int main() {
    f(M());
    return 0;
}

这个代码是不能编译的。如果f的参数类型改成f(const M&)就可以编译通过了。
这是为什么呢? 如果M()构造一个右值,不能传递给f(M&)这个左值引用,我能理解。
那为什么传递给const M&就OK了? 右值引用传递给常量左值引用,这样的参数匹配是合法的吗?

C++标准有没有任何的说明或者规定?
------解决思路----------------------
传参时M构造了一个临时对象,临时变量不能作为非const引用参数