cdsfiui 发表于 2017-04-17 10:06

形如decltype(1+2)是声明了一个xvalue还是一个prvalue?

cppreference上面说,decltype(expression)的用法是,
1.如果expression是一个xvalue,decltype就是一个右值引用T&&
2.如果expression是一个prvalue, decltype就是一个值类型T
3.如果expression是一个lvalue, decltype就是一个左值引用T&

但我的问题是: 什么样的expression算是xvalue呢? 返回值和临时变量都应该算xvalue吧.

decltype(1+1)返回的,是xvalue还是prvalue?
int i=1; decltype(i+1)返回的,是xvalue还是prvalue?

然后我试了一下,貌似都是prvalue:

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;
}

这个程序能编译通过,我就断定decltype(i+1)里面的i+1是一个prvalue,decltype声明的是T。
1.因为如果decltype声明了右值引用,那么j=i是编译不过的,不能把一个左值类型的变量绑定到一个右值引用对吧。
2.decltype(f()),拿到函数返回值,仍然是一个prvalue,而不是xvalue?

所以我的疑惑是:

如何写一个decltype(expression),得到一个xvalue?

bruceteen 发表于 2017-04-17 14:06

http://en.cppreference.com/w/cpp/language/value_category
页: [1]
查看完整版本: 形如decltype(1+2)是声明了一个xvalue还是一个prvalue?