func().k is an lvalue and func().i is an xvalue.
You can see this for more details: rvalues and temporary objects in the FCD
Althrough, it is not difficult to test whether they are lvalues or rvalues:
#include <iostream>
struct A
{
static int k;
int i;
};
int A::k = 10;
A func( ){ A a; return a; }
void f (int & ) { std::cout << "int& " << std::endl; }
int main ()
{
func().k = 0; //ok, because func().k is an r
f(func().k);
func().i = 1; //compile error: "using temporary as lvalue"
f(func().i); //compile error because func().i is an rvalue of type ‘int’
return 0;
}