我想知道以下内容是否有效:
#include <iostream>
#include <vector>
std::vector<int>& getVec()
{
static std::vector<int> vec{1, 2, 3, 4, 5};
return vec;
}
int main()
{
for (const auto& i : getVec())
{
std::cout << "i = " << i << std::endl;
}
return 0;
}
基本上我不确定临时来自getVec()
的生命周期。我查看了this post和this one,但由于我的函数返回对static
数据的引用,因此情况有所不同。具体来说,我想知道场景是否违反了规定的规则中的以下异常:
- 临时绑定到函数调用[...]
中的引用参数
或者如果这确实是安全的代码。我认为这是安全的,但只是想确定。
答案 0 :(得分:2)
是的,这是完全有效且定义明确的。
对于虚变量range
,begin
和end
,您的问题中基于范围的for循环被定义为与以下内容等效:
auto&& range = getVec();
auto begin = std::begin(range);
auto end = std::end(range);
for (; begin != end; ++begin)
{
const auto& i = *begin;
{
std::cout << "i = " << i << std::endl;
}
}
应用参考折叠规则后,range
的类型变为std::vector<int>&
。这意味着永远不会创造临时工。循环遍历getVec
中定义的静态向量。
如果getVec
改为按值返回,则range
的类型将为std::vector<int>&&
,并且将应用生命周期延期。这会将临时对象的生命周期延长到引用的生命周期,并且一切仍然完全有效。