2017-04-17 74 views
2

decltype(1 + 2)是否声明一个xvalue或/或prvalue?C++ 11:“decltype(1 + 2)”声明一个xvalue还是一个prvalue?

cppreference说,decltype(表情)将宣布: 1中。T & &如果表达式是x值 2.■如果表达式是prvalue 把t &如果表达式是左值

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

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(我+ 1 )声明第(i + 1)作为prvalue

因为如果它是一个x值,然后decltype得到Ť& &,不能结合到的“i”的左侧值可变。 decltype(f())也给我f()作为一个prvalue也很奇怪吗?

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

+0

http://en.cppreference.com/w/cpp/language/value_category#xvalue – user2357112

+1

你似乎混淆了几个概念。你不能“声明”一个值类别。你用类型声明变量。值类别是表达式的属性。 –

回答

5

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

i+1是一个prvalue,而不是一个id表达式。因此decltype产生一个非参考类型:decltype(i+1) j = i;意味着int j = i;

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

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

3

假设T不是引用类型。然后:

  • 对于T f();,类型decltype(f())T
  • 对于T& f();,类型decltype(f())T&
  • 对于T&& f();,类型decltype(f())T&&

那么碍事decltype产生一个右值引用是将其应用到一个x值表达式,例如,std::move(1 + 2)

+0

是不是1 + 2的价值? – user2357112

+0

@ user2357112:是的,为什么? –

+1

@ user2357112'std :: move(prvalue)'给出了xvalue –