2017-04-17 75 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 –