BOOST_FOREACH是否隐式使用引用?

3

我想知道在调用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;
}

1
有一篇关于 BOOST_FOREACH 实现的精彩文章:http://www.artima.com/cppsource/foreach.html - James McNellis
3个回答

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()) {}
}

感谢您提供的优秀示例代码,如果@Checkers没有发布实际的boost元编程摘录,我就会给出答案 :) - Jamie Cook

2

浏览了 BOOST_FOREACH 元编程的疯狂,我发现如果集合是:

  1. rvalue,
  2. "轻量级代理",可以通过特化 boost::foreach::is_lightweight_proxy 来为您的类型定义。

因此,lvalue 不会被复制。相反,它的指针被作为临时变量使用。

其中一个关键点是:

# 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。


0

不涉及问题中的参考部分。 - Jamie Cook
仍未真正解决核心问题,方法调用的结果必须存储在临时变量中...如果让宏来决定这一点,它会被存储在引用中吗?还是结果将被复制到新向量中(在此过程中产生性能损失)-请参见更新的问题。 - Jamie Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接