提问人:koral 提问时间:8/22/2019 最后编辑:koral 更新时间:8/24/2019 访问量:116
当转换函数按值返回时,boost::adaptors::transformed的意外行为
Unexpected behavior of boost::adaptors::transformed when the transformation function returns by value
问:
考虑以下一段 C++11 代码,这是我能想到的最小的复制器:
#include <iostream>
#include <boost/range/adaptor/transformed.hpp>
std::vector<uint32_t> myTransform(const std::vector<uint32_t>& iVector) {
return iVector;
}
int main() {
const std::vector<std::vector<uint32_t>> theInput{{1, 2}};
const auto myRange = theInput | boost::adaptors::transformed(myTransform);
for (auto it = boost::begin(myRange); it != boost::end(myRange); ++it) {
for (auto it2 = boost::begin(*it); it2 != boost::end(*it); ++it2) {
std::cout << *it2 << std::endl;
}
}
}
我希望它打印以下输出:
1
2
...但它会打印(参见 http://cpp.sh/8yivt):
0
0
但是,如果我更改为返回如下引用:myTransform
const std::vector<uint32_t>& myTransform(const std::vector<uint32_t>& iVector) {
return iVector;
}
...然后我得到预期的输出(参见 http://cpp.sh/5brvl)。
我无法从 Boost.Range 文档中找到对此行为的任何解释。我的代码不正确吗?我的期望不正确吗?这是 Boost.Range 中的错误/已知限制吗?
这个问题的目的首先是要理解为什么它会以一种意想不到的方式表现出来,并且只是顺便找到解决方案。
答: 暂无答案
评论
auto vec = *it
for (auto it2 = boost::begin(vec); it2 != boost::end(vec); ++it2) { ... }
for (uint32_t x : *it) { ... }
*it
boost::begin
it2
auto vec = *it
1 2
*it
;
it2