为什么这个提升转换操作会导致第二个元素错误?

时间:2014-08-21 05:24:32

标签: c++ boost

可能possible bug in boost transformed adaptor相关,但我不确定......

我正在尝试创建一个使用boost::adaptors::transformed返回转换范围的函数。为此,我改编了the example on the boost doc website,并执行了以下操作:

#include <boost/range/adaptor/transformed.hpp>
#include <iostream>
#include <vector>
struct double_int
{
    typedef int result_type;
    int operator()(int x) const { return 2 * x; }
};

boost::transformed_range<double_int, std::vector<int>> Fun(std::vector<int> input)
{
    return input | boost::adaptors::transformed(double_int());
}

int main()
{
    std::vector<int> input {0, 1, 2, 3};

    for (auto elem : Fun(input))
        std::cout << elem;

    return 0;
}

这个程序的预期输出是0, 2, 4, 6,但我得到了这个:

  

0046

第二个号码错了!为什么呢?

我将boost 1.55gcc 4.8.1

一起使用

1 个答案:

答案 0 :(得分:4)

我认为你有未定义的行为。您通过值将input传递给函数,并且boost范围通过引用获取它。当您使用返回的范围时,它将保留对已销毁的矢量的引用并导致未定义的行为。

This works

#include <boost/range/adaptor/transformed.hpp>
#include <iostream>
#include <vector>
struct double_int
{
    typedef int result_type;
    int operator()(int x) const { return 2 * x; }
};

boost::transformed_range<double_int, std::vector<int>>
       Fun(std::vector<int> &input) // takes reference
{
    return input | boost::adaptors::transformed(double_int());
}

int main()
{

    std::vector<int> input {0, 1,2,3,4};
    for (auto elem : Fun(input))
        std::cout << elem;

    return 0;
}