2017-04-17 8 views
2

decltype(1 + 2)はxvalueまたはprvalueを宣言していますか? 1. T & &を式は左辺値C++ 11: "decltype(1 + 2)"はxvalueまたはprvalueを宣言しますか?

しかし、私の質問であれば式は 3. T & prvalueであれば式ははxValue 2. Tの場合:

cppreferenceは、decltype(式)を宣言しますと言いますは:どのように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; 
} 

このプログラムはコンパイル:私はその

decltypeを判断することができ(I + 1 )prvalue

として(I + 1)を宣言し、それははxValueだ場合ので、その後、decltypeは、 "私" の左側の値変数にバインドすることはできませんT & &を取得します。 decltype(f())も私にfval(prvalue)を与えてくれるのは奇妙です。

私の質問は:decltype(expression)が私にxvalueを与えるように式を書く方法は?おかげさまで

+0

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

+1

あなたはいくつかの概念を混乱させるようです。値カテゴリを宣言することはできません。型を持つ変数を宣言します。値カテゴリは式のプロパティです。 –

答えて

5

Decltypeは式ではなく型に解決されます。つまり、それは "prvalue"を宣言するなどとは言えません。

i+1は、正価であり、id式ではありません。従って、decltypeは、非参照型:decltype(i+1) j = i;を意味する。int j = i;を意味する。

第2の場合も同様です。 f()は正価であるため、decltype(f())Sです。

decltype(expression)をrvalue参照型に解決するには、式はxvalueでなければなりません。たとえば、decltype(std::move(f()))S&&です。

3

Tが参照型ではないとします。その後:T f();については

  • 、タイプdecltype(f())Tです。
  • T& f();の場合、タイプdecltype(f())T&です。
  • T&& f();の場合、タイプdecltype(f())T&&です。

のでdecltypeは右辺値参照を生成するために取得する方法は、例えば、std::move(1 + 2)ため、はxValue式にそれを適用することです。

+0

1 + 2はプライマリではありませんか? – user2357112

+0

@ user2357112:はい、そうです、なぜですか? –

+1

@ user2357112 'std :: move(prvalue)'はxvalueを返します –

関連する問題