此可能与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.55
与gcc 4.8.1
答案 0 :(得分:4)
我认为你有未定义的行为。您通过值将input
传递给函数,并且boost范围通过引用获取它。当您使用返回的范围时,它将保留对已销毁的矢量的引用并导致未定义的行为。
#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;
}