1

http://en.cppreference.com/w/cpp/language/decltypeによると

struct A {
    double x;
};
const A* a = new A();

decltype( a->x ) x3;

1 つのケースに一致します。つまり:

引数が、括弧で囲まれていないオブジェクト/関数の名前であるか、メンバー アクセス式 (object.member または pointer->member) である場合、 は、decltypeこの式で指定されたエンティティの宣言された型を指定します。

しかし、このメモ:

オブジェクトの名前が括弧で囲まれている場合、左辺値式になります

次の質問に私を導きます:a->x左辺値式でない場合の型は何ですか?

理由もわかりません

decltype((a->x)) x4 = x3; // type of x4 is const double& (lvalue expression)

は、左辺値式と見なされるという事実によってのみ として評価されconst&ます。リンクは実際には表示されません。

4

2 に答える 2

4

左辺値式でない場合、a->x の型は何ですか?

あなたは単に混乱しています。

オブジェクトの名前が括弧で囲まれている場合、左辺値式になります

そうあるべき

オブジェクトの名前が括弧で囲まれている場合、decltype によって異なる処理が行われます。

括弧で囲まれたものと括弧で囲まれていないものは両方とも左辺値式です。括弧を付けない場合、decltype は式の型を検査しませんが、名前ルックアップが参照する名前を見つけた宣言で使用されている型を検査します (たとえば、int&&名前ルックアップがそれを右辺値に解決する場合など)。変数を参照しますが、式の型はint左辺です)。

于 2013-04-12T10:50:44.667 に答える
2

それについて考える方法は(IMHO)これです:

decltype( a->x )

メンバー変数を参照する情報を保持/取得するxため、メンバー変数の宣言された型が得られます。これが自動的に次のケースに変わる場合、その情報を抽出できなかったので、これは役に立ちます。

decltype( (a->x) )

これは「単なる」式であるため、他の式と同様に動作します。式が参照するものではなく、式が返すものを参照します。式は左辺値であり、メンバー変数であることは問題ではありません。利用可能な情報の一部を明示的に破棄し、オブジェクト/メンバーが宣言されたものには関心がなく、式の結果の型だけに関心があることを表明します。

つまり、最初の構文は、それらが必要ないと明示的に判断して 2 番目の構文を使用しない限り、より多くの情報を提供します。

于 2013-04-12T10:27:28.943 に答える