2017-09-14 20 views
0

このコードを書き、gccでコンパイルしました。 私は結果 "2"を得ることを期待しましたが、結果は "0"でした。ユニバーサルリファレンスと名前付きパラメータのアイデア

他のコンパイラclangとvcは "2"を出力します。 定義されていない動作ですか?

#include <stdio.h> 

struct Test { 
    Test& inc() { 
     ++value; 
     return *this; 
    } 

    int value = 1; 
}; 

int main() { 
    auto&& t = Test().inc(); // The life-time of the temporary might extended. 
    printf("%d\n", t.value); // gcc prints "0". dangling reference? 

    return 0; 
} 

c.f.無関係である(つまり、普遍的な参照が名前に変更されているものです)http://rextester.com

+0

http://rextester.com/GBM44684 – sumomoneko

+0

私は自動演繹について誤っています。 'auto && t = Test()。inc()'は 'auto && t = Test();ではありません。 t.inc(); 'ありがとう@クエンティン! – sumomoneko

+0

'gcc-7 -fsanitize-address-after-scope'はこのエラーを検出できます。 – sumomoneko

答えて

2

転送参照の上reslutを構築する - あなたと同じ行動を観察します定期的な参照。

問題はauto &&t = Test();がなように、それは、参照にバインド直接ではないのでTestの寿命が延長されていないということです。代わりに、そのメンバ関数は左辺値の参照を返します。これはtTest &として推定し、初期化するために使用されます(これはdecltype(t)で確認できます)。その後、一時的なものが破壊され、参照がぶら下がり、それを使用することは未定義の動作です。

関連する問題