以下代码是否包含 UB ?对本地对象的引用在返回时会变坏,但如果它们是通过const引用返回的,那么它们的生命周期会延长,所有返回都是通过const引用进行的(尽管通过auto),一切似乎都很好:
std::vector<int> Foo(int N = 10)
{
std::vector<int> rv;
for (int i = 0; i < N; ++i)
{
rv.push_back(i + 10);
}
return rv;
}
int GetNumber()
{
const auto &num = Foo().front();
return num;
}
int main()
{
int x = GetNumber();
std::cout << x << std::endl;
return 0;
}
PS。然而,这段代码有时表现得不恰当(不完全是这个,我把所有东西都压缩成一个最小的例子,我们有更复杂对象的 std::vector,并且仍然有线程并行旋转,这一切都增加了真实表现的可能性UB)。
在上面的示例中,根本不返回引用,只返回值。但最重要的是,这里也没有延长寿命。那些。执行此表达式后链接
const auto &num = Foo().front();立即终止,因为它没有直接绑定到临时对象std::vector<int>,而是绑定到此向量的第一个元素的链接。因此,当取消引用此引用时,return num;会发生未定义的行为。