2017-01-13 9 views
2

次のコードの結果は0100です(CLang、GNU ++ 14に準拠)。 funcはパラメータとしてrvalueベクトルを取るので、forward(c)[0]はintのconst参照であるため、decltype(auto)の型減算はconst int &になるはずです。結果を理解するのを手伝ってください。ありがとう!なぜrvalueの要素からのdecltype(auto)の型減算int vector is int&?

template <typename T> 
decltype(auto) func(T&& c) 
{ 
    return forward<T>(c)[0]; 
} 

int main(int argc, const char * argv[]) 
{ 
    cout 
    << is_same< int, decltype(func(vector<int>{3}))>::value 
    << is_same< int&, decltype(func(vector<int>{3}))>::value 
    << is_same< const int, decltype(func(vector<int>{3}))>::value 
    << is_same< const int&, decltype(func(vector<int>{3}))>::value 
    << endl; 
    return 0; 
} 

出力:

0100 

答えて

4

c右辺値参照です。

[]は、constおよび非constオーバーロードを持ちます。タイプがvector<T,A>&&のベクトルを渡すと、選択されたオーバーロードはconstである。

[](値またはrvalueを返す&&オーバーロードを持つことができます)が、既存のコードを破損する可能性があります。おそらくこれは少なくともstd2まで起こらず、stdの改訂を破ることができ、既存のコードを壊すことはありません。

+0

'std2'?前にそれについて聞いたことはありません。あなたが指摘する参考資料はありますか?ありがとうございました。また、 'decltype(auto)'では実際の型、つまり 'U 'ではなく' operator'の 'U'であるという事実についての質問でした。 – skypjack

+0

@skypjackコンパイラは実際に 'int&'を返し、OPは 'const int&'を期待していました。 –

+0

@ A.S.Hああ、そうです。質問のコメントを逃した。ごめんなさい。 – skypjack

関連する問題