2017-09-14 80 views
0

我寫了這段代碼並用gcc編譯。 我希望得到結果「2」,但結果是「0」。通用引用和命名參數Ideom

其他編譯器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.建立reslut上http://rextester.com

+0

http://rextester.com/GBM44684 – sumomoneko

+0

我誤解了自動演繹。 'auto && t = Test().inc()'不是'auto && t = Test(); t.inc();'。謝謝@Quentin! – sumomoneko

+0

'gcc-7 -sanitize-address-use-after-scope'可以檢測到這個錯誤。 – sumomoneko

回答

2

轉發引用(這就是普遍引用已被更名爲)是不相關的 - 你會觀察到有相同的行爲定期參考。

的問題是,Test的壽命不延長,因爲它不是直接結合至參考,如auto &&t = Test();會。相反,它的成員函數返回一個左值引用,該值用於推斷並初始化tTest &(可以通過decltype(t)查看)。然後臨時被破壞,引用現在懸而未決,並且使用它是未定義的行爲。