2017-02-23 12 views
1

私は複数の引数を持つdecltypeを読んでいます。他の人によると、すべての型が一貫していることを検証し、そうであれば最後のパラメータを完全に破棄します。2つの引数を持つDecltypeは型を変更します

int i = 7; 
    decltype(i) var = i; 
    ++var; 
    cout << i << endl; // prints '7', as I would expect 

しかし:しかし、別のパラメータを渡すと、戻り値に影響を与えないように思わ

int i = 7; 
    decltype(1, i) var = i; 
    ++var; 
    cout << i << endl; // prints '8' - apparently 'var' is now a reference to 'i' 

それはなぜですか?

+1

'他の人によると、すべての型が一貫していることを検証し、そうであればすべてのパラメータを完全に破棄しますが、最後のものは何ですか?私は誰もそれを以前に主張したことはなかった。 – cpplearner

+0

たとえば、私が正しく理解していれば、ここで:http://stackoverflow.com/questions/16044514/what-is-decltype-with-two-arguments?rq=1。コンマで区切られた一対の式は左から右に評価され、左の式は破棄された値式 "、"結果は右のオペランドと同じ値カテゴリになります " – Valentin

+0

Try' decltype((i) ) ' –

答えて

2

あなたがC++(カンマ演算子)でのオペレータである,を見ています。 T2& operator,(const T& a, T2& b);

のでa, b, c(表現することができabccの戻り値の型への参照を返します((a,b),c)(b,c)(c)、として評価される:row 16

その宣言してもよい。このように見えますが、参照してください。

あなたの場合、1, iは、最後の言葉への参照を返します。i従ってタイプは、発現され、そしてdecltypeの引数は、即時識別子(またはクラスのメンバである場合、それはiint&

3

decltypeは複数の引数をとりません。あなたはカンマ式になる単一の引数を渡しました。コンマ式の最後の引数が変数である場合、一時的な式を導入するのではなく、式全体が参照として評価されます。

あなたはdecltypeせずに同じものを見ることができます:

#include <iostream> 

int main(void) { 
    int i = 5; 
    (1, i) = 10; 
    std::cout << i << std::endl; 
} 
2

への参照である値を返したようdecltype(1, i) var = i;int& var = i;

(i)なり、int&ありますアクセス)では、特殊な方法で扱われます。これは、引数の宣言された型が正確に示されています。

それ以外の場合、decltypeの引数はの式として扱われます。その式の値カテゴリに従って調整された式の型に解決されます。例えば。式が左辺である場合、そのようなdecltypeで示されるタイプは参照タイプです。

あなたの場合、decltype(i)は最初のカテゴリに分類されます。従ってはintの略で、iintと宣言されているため、intの略です。

一方、decltype(1, i)は最初のカテゴリには該当しません。引数は式1, iとして扱われます。 C++ではコンマ演算子をこのように適用した結果、の値がであるため、decltypeはタイプint &を示します。

decltype((i))は、余分な()のために、最初のカテゴリに適合しません。式(i)は左辺値なので、decltype((i))はタイプint &を示します。

関連する問題