Dan*_*iel 37 c++ gcc deque filter-iterator c++11
在经历了许多痛苦和痛苦之后,我已经找到了一些非常奇怪的行为,std::distance当给出一系列boost::filter_iterators超过a 时,它永远不会返回std::deque.看来问题是GCC(6.1+)的-O3优化问题.这是一个演示违规行为的示例:
#include <string>
#include <deque>
#include <iterator>
#include <iostream>
#include <boost/iterator/filter_iterator.hpp>
struct Foo
{
std::string bar, s = "";
char a = '\0';
};
int main()
{
const std::deque<Foo> foos(14, {""});
const std::string test {};
const auto p = [test] (const auto& foo) { return foo.bar == test; };
using boost::make_filter_iterator;
const auto begin = make_filter_iterator(p, std::cbegin(foos), std::cend(foos));
const auto end = make_filter_iterator(p, std::cend(foos), std::cend(foos));
std::cout << std::distance(begin, end) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
一些观察:
-O2按预期进行优化或回报较少.std::deque到std::vector或std::list在预期的行为结果.14很关键; 什么都没有,问题就消失了.sizeof(Foo)很重要; 移除s或a使问题消失.test通过引用捕获,或仅仅与常量表达式(例如foo.bar == " ")比较导致正常行为.-Wall -Wextra -pedantic).fsanitize=undefined和问题消失了.这是怎么回事?
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |