BOOST_FOREACH隐式使用引用?

时间:2010-03-02 08:35:35

标签: c++ boost reference foreach

我想知道在调用之前获取对向量的引用是否有任何好处 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;
}

3 个答案:

答案 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元编程疯狂来看,如果它是

,我会看到该集合被复制了
  1. 一个右撇子,
  2. “轻量级代理”,您可以通过专门化boost::foreach::is_lightweight_proxy来为您的类型定义。
  3. 因此,不会复制左值。相反,它的指针被视为临时。

    至关重要的是:

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

  

And although BOOST_FOREACH is a macro, it is a remarkably well-behaved one. It evaluates its arguments exactly once, leading to no nasty surprises

所以my_method()不会被多次调用

从用户的角度来看,引用的行为类似于“普通”变量,您可以将引用视为与原始变量完全相同。它对foreach循环没有任何影响。

所以两个循环都是等价的。