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;
}

cf 在http://rextester.com上构建 reslut

4

1 回答 1

2

转发引用(即通用引用已重命名为)是无关紧要的——您将观察到与常规引用相同的行为。

问题是Test的生命周期没有延长,因为它没有直接绑定到引用,就像auto &&t = Test();那样。相反,它的成员函数返回一个左值引用,用于推断和初始化t为 a Test &(您可以通过 来检查decltype(t))。然后临时对象被破坏,引用现在悬空,使用它是未定义的行为。

于 2017-09-14T08:15:26.627 回答