Whether the function name is a lvalue or an rvalue when used as an expression?
An id-expression naming a function is an lvalue expression of the function's type. There are no rvalue expressions with function type.
Why can both function left and right references be bound to function names?
Because lvalue expressions of function type are specifically exempt from the requirement that a rvalue reference must be initialized, after potential temporary materialization, by an rvalue (specifically xvalue) expression. See "or function" in [dcl.init.ref]/5.3.1.
This was probably chosen to be specified this way since it is the most convenient choice. The alternatives would be either to disallow rvalue references to functions completely, which would make generic code unnecessarily more difficult to write or to introduce a notion of function rvalues, which would just force everyone to write std::move
around function names all the time.
flref l = foo;
In this sentence, is the right side of the equal sign an expression?
It is called a statement, not a sentence. The right-hand side of the equals sign in a variable initializer must always be either a braced-init-list (i.e. = { /*...*/ }
) or an expression. If there are no braces, then it can't be anything but an expression.
As an aside: Calling a "lvalue reference" a "left reference" and a "rvalue reference" a "right reference" is very misleading. The pre-C++ origin of the terms "lvalue" and "rvalue" might be related to "left" and "right" side of assignment, but that meaning is only applicable in a small subset of the C++ language.