42

型推論機能に関するウィキペディアのこの記事をC++11 読んでいました。

例があり、引用します:

#include <vector>
int main() {  
    const std::vector<int> v(1);  
    auto a = v[0];        // a has type int  
    decltype(v[1]) b = 1; // b has type const int&, the return type of  
                          //   std::vector<int>::operator[](size_type) const  
    auto c = 0;           // c has type int  
    auto d = c;           // d has type int  
    decltype(c) e;        // e has type int, the type of the entity named by c  
    decltype((c)) f = c;  // f has type int&, because (c) is an lvalue  
    decltype(0) g;        // g has type int, because 0 is an rvalue  
}

次の行で:

    decltype(c) e;        // e has type int, the type of the entity named by c  
    decltype((c)) f = c;  // f has type int&, because (c) is an lvalue  

cとはどう違い(c)ますか?が左辺値(c)を表すのはなぜですか?

4

2 に答える 2

23
  • c変数の名前です。

  • (c)変数の値と同じ値を持つ式 (この場合は左辺値c式) です。

そして、この 2 つは によって異なる方法で扱われdecltypeます。たとえば、式decltype(1+2)を取る例でもある を考えてみましょう。たまたま、あなたの例が式の単純なバージョンです。つまり、単一の変数に名前を付けるだけで、何も刺激的なことはありません。

これは、言語仕様の微妙な部分について合理化する場合にのみ、一般的に本当に気にする違いの 1 つです。ただし、あなたが特定したように、この場合は非常に重要な実際的な効果があります。

ただし、ここではオペレーターの使用はありません。それはすべて、文法のレイアウトからの単純な演繹です。

于 2013-01-02T00:57:16.253 に答える
11

ここで良い説明を見つけました。次の違いについて説明します。

struct A { double x; };
const A* a = new A();
...
decltype(a->x) x4; // type is double
decltype((a->x)) x5; // type is const double&

そして私は引用します:

decltype の後の 2 つの呼び出しの違いの理由は、括弧で囲まれた式(a->x)が ID 式でもメンバー アクセス式でもないため、名前付きオブジェクトを示さないためです。[ 13 ]

式は左辺値であるため、その推定型は「式の型への参照」またはconst double&. [ 10 ]

于 2013-01-02T23:06:26.247 に答える