C++ 11:"decltype(1 + 2)"声明xvalue还是prvalue?

Hin*_*sum 2 c++ decltype xvalue c++11 prvalue

decltype(1 + 2)是否声明了xvalue或prvalue?

cppreference说,decltype(表达式)将声明:1.T && if表达式是否是xvalue 2.如果表达式是prvalue 3. T&if表达式是lvalue

但我的问题是:如何生成一个xvalue的表达式?我想返回值和临时对象应该是xvalue,但实际上它们似乎是xvalue,在我的实验中:

struct S{};
S f();
int main()
{
    int i=2;
    decltype(i+1) j=i;
    ++j;
    printf("i=%d\n",i);
    S obj;
    decltype(f()) k=obj;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序编译:我可以判断

decltype(i + 1)将(i + 1)声明为prvalue

因为如果它是一个xvalue,那么decltype得到T &&,它不能绑定到左值变量"i".decltype(f())也给我f()作为prvalue也很奇怪?

所以我的问题是:如何写一个表达式,以便decltype(表达式)给我一个xvalue?谢谢.

M.M*_*M.M 5

Decltype解析为一个类型,而不是一个表达式 - 你不能说它"声明一个prvalue"或类似的东西.

i+1是一个prvalue,而不是id-expression.因此decltype产生一个非引用类型:decltype(i+1) j = i;意味着int j = i;.

第二种情况类似; f()是一个prvalue,decltype(f())也是S.

要decltype(expression)解析为右值引用类型,表达式必须是xvalue.例如decltype( std::move(f()) )是S&&.