【问题标题】:c++ boost ranges: any_range and transformed adaptorc++ 提升范围:any_range 和转换后的适配器
【发布时间】:2017-10-30 00:20:53
【问题描述】:

我正在尝试将使用 boost 转换适配器的 boost 范围包装到 boost any 范围中,但这似乎不起作用。我构建了一个最小的例子来说明。

std::vector<int> myInts = { 1,2,3,4,5 };
boost::any_range<double,boost::forward_traversal_tag,double> range =
    myInts | boost::adaptors::transformed( []( int x ) { return static_cast<double>( x ); } );

for ( double x : range )
    std::cout << x << "\n"; 

在发布模式下,我的 VS2015 编译器一直告诉我“返回局部变量或临时地址”。该代码在执行时也无法正确执行。在调试模式下一切正常。

我认为 any_range 以某种方式无法理解转换后的适配器按值返回,即使我将 Reference 模板参数显式设置为 double 而不是默认的 double&amp;

any_range 我做错了什么? (使用提升 1.64.0)

【问题讨论】:

  • 如果将boost::any_range 替换为auto,错误是否仍然存在?只是试图确定问题是否在任何范围内,或者是否更早。
  • 如果我将boost::any_range 替换为auto,错误就消失了。仅当我使用 boost::any_range 键入擦除转换迭代器时才会出现该错误。

标签: c++ boost boost-range boost-iterators


【解决方案1】:

您需要将您的范围声明更改为boost::any_range&lt;const double, boost::forward_traversal_tag, const double&gt;,因为类型推导系统需要实现您的范围是只读的。

【讨论】:

  • 谢谢。这确实解决了运行代码时的问题。但奇怪的是,编译器警告仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2017-11-14
  • 2014-02-19
  • 2013-01-24
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多