我想知道在调用之前获取对向量的引用是否有任何好处 BOOST_FOREACH或是否会自动使用返回引用的方法调用?例如,以下两个循环中的哪一个将等同于第三个循环?
vector<float>& my_method();
void main()
{
// LOOP 1 -------------------------------
vector<float>& temp_vector = my_method();
BOOST_FOREACH(float element, temp_vector)
cout << element << endl;
// LOOP 2 -------------------------------
vector<float> temp_vector = my_method();
BOOST_FOREACH(float element, temp_vector)
cout << element << endl;
// Which loop is this one most like? ----
BOOST_FOREACH(float element, my_method())
cout << element << endl;
}
答案 0 :(得分:4)
快速测试显示该函数被调用一次,并且没有与BOOST_FOREACH
相关的复制。
#include <vector>
#include <iostream>
#include <boost/foreach.hpp>
struct X
{
X() {}
X(const X& ) { std::cout << "copied\n"; }
};
std::vector<X> vec(2);
//std::vector<X> method()
std::vector<X>& method()
{
std::cout << "returning from method\n";
return vec;
}
int main()
{
BOOST_FOREACH(const X& x, method()) {}
}
答案 1 :(得分:2)
通过BOOST_FOREACH
元编程疯狂来看,如果它是
boost::foreach::is_lightweight_proxy
来为您的类型定义。因此,不会复制左值。相反,它的指针被视为临时。
至关重要的是:
# define BOOST_FOREACH_SHOULD_COPY(COL) \
(true ? 0 : boost::foreach_detail_::or_( \
BOOST_FOREACH_IS_RVALUE(COL) \
, BOOST_FOREACH_IS_LIGHTWEIGHT_PROXY(COL)))
然后它被用作函数的一个参数,用于将容器计算为临时变量:
template<typename T>
inline auto_any<T> contain(T const &t, boost::mpl::true_ *) // rvalue
{
return t;
}
template<typename T>
inline auto_any<T *> contain(T &t, boost::mpl::false_ *) // lvalue
{
// Cannot seem to get sunpro to handle addressof() with array types.
#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x570))
return &t;
#else
return boost::addressof(t);
#endif
}
我的系统中安装了Boost v1.38。
答案 2 :(得分:0)
所以my_method()
不会被多次调用
从用户的角度来看,引用的行为类似于“普通”变量,您可以将引用视为与原始变量完全相同。它对foreach循环没有任何影响。
所以两个循环都是等价的。