1

重複の可能性:
decltypeと括弧

int i=6;
decltype((i)) var5 = i;      // int& 

括弧内にある「i」が左辺値と見なされる理由がわかりませんでした。MSDNで「内側の括弧によってステートメントが式ではなく式として評価されることがわかるまで、括弧の適用を知っていました。メンバーアクセス(http://msdn.microsoft.com/en-us/library/dd537655.aspx)、そして私も長い間理解していなかった質問を理解していませんでした。

template<typename T>
class B
{
public:
    B(T t){printf("B\n");}

};
template <typename T >
void ft(T t)
{
    t.f();
}
int _tmain(int argc, _TCHAR* argv[])
{
    B<A> b1(A());   //one function declaration, A() is regarded as fun-ptr, and b1 is a function
    B<A> b2((A())); //A() is regarded as anonymous object.
    return 0;   
}

A()かっこで囲んだときに匿名オブジェクトと見なされるのはなぜですか(A())。MSDNのdecltypeに関する内括弧の説明は、この状況には適用できません。C ++標準のこの2つの状況で、括弧関数についての拡張があることを誰かに教えてもらえますか。どうすればこれをよりよく理解できますか、とても感謝しています!

4

1 に答える 1

2

それらは本当に完全に異なる状況です。

B<A> b1(A());

これは、構文生成「return-type識別子'(' parameter-declaration-list')'」に従うため、関数宣言です。ここで、parameter-declaration-listは、パラメーター宣言のコンマ区切りのリストです。このような宣言の生成は「typeabstract-declarator[opt]」です。抽象宣言子は、とりわけ、空、または「'('抽象宣言子')'」にすることができます。したがって、「A()」はタイプ(A)と一致し、その後に空の形式のabstract-declaratorを含む括弧形式のabstract-declaratorが続きます。したがって、コードは構文的に有効な関数宣言であり、そのように解析されます。

B<A> b1((A()));

ここで、関数宣言ルートを使用する場合は、「(A())」をパラメーター宣言に一致させる必要があります。ただし、これを行う方法はありません。したがって、これは関数宣言ではないため、直接初期化子を使用した変数宣言である必要があります。

もう1つの状況は、文法的に明確です。decltype(i)とdecltype((i))はどちらも単純なdecltype派生です。最初のケースでは、構文ツリーはDeclType(DeclRefExpression( "i"))であり、2番目のケースでは、DeclType(ParenExpression(DeclRefExpression( "i")))です。

ここでの特別な部分は、decltypeのルールです。decltypeのルールは次のとおりです。

  1. 式が関数呼び出しの場合、decltypeの結果は、その関数の宣言された型になります。たとえば、「int foo()」が与えられた場合、decltype(foo())は「int」です。「int&foo()」が与えられると、decltype(foo())は「int&」になります。
  2. 式が宣言参照式である場合、decltypeの結果は、その宣言の宣言された型になります。「inti」が与えられると、decltype(i)は「int」になります。「int&i」が与えられると、decltype(i)は「int&」になります。
  3. 上記のいずれにも当てはまらず、式が左辺値である場合、decltypeの結果は、式の型への左辺値参照になります。式がint型の左辺値の場合、結果は「int&」になります。
  4. 上記の規則のいずれにも当てはまらない場合、decltypeの結果は式の型になります。式がint型の右辺値である場合、結果は「int」になります。

decltype(i)では、式はiのdeclrefです。iのタイプはintです。したがって、decltype(i)は「int」です。decltype((i))では、式はparenexprです。括弧に何が含まれているかは関係ありません。ルール1も2も適用できません。ただし、(i)は左辺値であるため、ルール3が適用されます。(i)の型はintであるため、decltype((i))は「int&」です。

于 2012-06-08T12:23:54.377 に答える