我觀察下面的代碼段的一個相當怪異的行爲:的boost :: any_range <GSL :: string_span <>>墜毀在Release模式
#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_range
和gsl::string_span
(注意,提交更改string_view
到string_span
已在幾個小時前提交給GSL)後作爲參數通過功能f
接收的一系列字符串。
我原來的代碼沒有一個const T
爲Reference
模板參數any_range
(這是一個簡單的T
),並在執行過程中墜毀。然而,這隻發生在發佈模式下,在Debug或RelWithDebInfo(由CMake生成)中工作正常。我用VS2013/2015 x64。此外,試圖調試完整的發佈版本,添加調試輸出到轉換lambda消除了崩潰(我的猜測是它阻止了一些內聯)。我的最終工作解決方案是將const T
指定爲Reference
。
但是,我仍然想知道爲什麼是否首先崩潰?它是VS編譯器錯誤嗎?目前執行中的錯誤string_span
?或者我只是在濫用boost::any_range
?
編輯
剛剛建成的版本鏗鏘3.7.0和行爲是相似的(在調試工作正常,並不會崩潰,但沒有const T
與-O2
輸出垃圾)。所以它看起來不像編譯器問題。
祝你好運調試。你試過調試它嗎?您可以在發行模式下進行調試。 –
@WarrenP當然。但它在Debug/RelWithDebInfo模式下工作得很好,甚至在Release模式下的lambda中也有一些調試輸出,有點讓調試真的很難:) – Rostislav