通用引用和命名参数概念
Universal Reference and Named Parameter Ideom
我写了这段代码并用 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
上生成结果
转发引用(即通用引用已重命名的内容)无关紧要——您会观察到与常规引用相同的行为。
问题是 Test
的生命周期没有延长,因为它没有 直接 绑定到引用,而 auto &&t = Test();
会.相反,它的成员函数 returns 是一个左值引用,用于将 t
推导和初始化为 Test &
(您可以通过 decltype(t)
进行检查)。然后临时文件被破坏,引用现在悬空,使用它是未定义的行为。
我写了这段代码并用 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
上生成结果转发引用(即通用引用已重命名的内容)无关紧要——您会观察到与常规引用相同的行为。
问题是 Test
的生命周期没有延长,因为它没有 直接 绑定到引用,而 auto &&t = Test();
会.相反,它的成员函数 returns 是一个左值引用,用于将 t
推导和初始化为 Test &
(您可以通过 decltype(t)
进行检查)。然后临时文件被破坏,引用现在悬空,使用它是未定义的行为。