gpt4 book ai didi

c++ - boost::any_range> 在 Release模式下崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:51 24 4
gpt4 key购买 nike

我观察到以下代码的一个相当奇怪的行为:

#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/any_range.hpp>

#include <vector>
#include <string>
#include <iostream>

#include "gsl.h"

template <typename T>
using ImmutableValueRange = boost::any_range<T, boost::bidirectional_traversal_tag, /*const*/ T>;

template <typename T, typename C>
ImmutableValueRange<T> make_transforming_immutable_range(const C& container)
{
return container | boost::adaptors::transformed([](const typename C::value_type& v) -> T
{
//std::cout << "trans : " << T{ v }.data() << "\n";
return T{ v };
});
}

void f(ImmutableValueRange<gsl::cstring_span<>> r)
{
for (const auto& c : r) {
std::cout << c.data() << "\n";
}
}

int main()
{
std::vector<std::string> v({ "x", "y", "z" });

f(make_transforming_immutable_range<gsl::cstring_span<>>(v));
}

这里的想法是隔离字符串序列的实际表示,该字符串序列由 any_rangegsl 后面的函数 f 作为参数接收: :string_span(请注意,将 string_view 更改为 string_span 的提交已在几个小时前提交给 GSL)。

我的原始代码没有 const T 作为 any_rangeReference 模板参数(这是一个简单的 T) 并且它在执行过程中崩溃了。但是,这仅发生在 Release 模式下,在 Debug 或 RelWithDebInfo(由 CMake 生成)中运行良好。我使用 VS2013/2015 x64。此外,尝试调试完整的 Release 版本,将调试输出添加到转换 lambda 消除了崩溃(我的猜测是它阻止了一些内联)。我最终的工作解决方案是将 const T 指定为 Reference

但是,我仍然想知道为什么首先会发生崩溃?是VS编译器的错误吗? string_span 的当前实现中存在错误?还是我只是误用了 boost::any_range

编辑

刚刚使用 clang 3.7.0 构建了版本并且行为相似(在调试中工作正常并且不会崩溃,但是在没有 const T-O2 的情况下输出垃圾>).所以它看起来不像是编译器问题。

最佳答案

事实证明,any_rangedereference 方法将返回对T 的引用,除非Reference 类型被指定为 const T,因此创建了一个对临时对象的悬空引用。发生这种情况是由于使用了 any_iterator_interface.hpp 中定义的 any_incrementable_iterator_interface::mutable_reference_type_generator .

因此,该问题的正确解决方案确实是将 const T 指定为 Reference 类型,以防迭代器取消引用返回临时值。

关于c++ - boost::any_range<gsl::string_span<>> 在 Release模式下崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33535221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com