Ranged base for loop over 临时参考 C++11
Ranged base for loop over temporary reference C++11
我想知道以下是否有效:
#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()
的临时文件的生命周期。我已经查看了两个 and this one,但我的情况有点不同,因为我的函数 returns 是对 static
数据的引用。具体来说,我想知道场景是否违反了规定规则中的以下例外情况:
- A temporary bound to a reference parameter in a function call [...]
或者如果这确实是安全代码。我认为它是安全的,但只是想确定一下。
是的,这是完全有效且定义明确的。
对于虚变量 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>&&
,并且将应用生命周期延长。这会将临时对象的生命周期延长到引用的生命周期,并且一切仍然完全有效。
我想知道以下是否有效:
#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()
的临时文件的生命周期。我已经查看了两个 static
数据的引用。具体来说,我想知道场景是否违反了规定规则中的以下例外情况:
- A temporary bound to a reference parameter in a function call [...]
或者如果这确实是安全代码。我认为它是安全的,但只是想确定一下。
是的,这是完全有效且定义明确的。
对于虚变量 range
、begin
和 end
:
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>&&
,并且将应用生命周期延长。这会将临时对象的生命周期延长到引用的生命周期,并且一切仍然完全有效。