Я обобщу свои собственные выводы с тем, что другие люди нашли в комментариях.Это не фактический ответ (пока), поскольку в настоящее время я не могу объяснить причину сбоя.
Мне удалось воспроизвести это поведение, установив g ++ - 8 и g ++ - 9 внутри обычного ubuntu
Образ Docker, так что у меня были доступны и /usr/bin/g++-8
, и /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.26
.
Согласно трассировке стека gdb
, ошибка происходит где-то в конструкторе std::vector
.Похоже, что это происходит, когда конструктор копирования по умолчанию для std::filesystem::path
вызывается внутри его operator/
:
/usr/include/c++/8/bits/fs_path.h
/// Append one path to another
inline path operator/(const path& __lhs, const path& __rhs)
{
path __result(__lhs); // <-- fails here
__result /= __rhs;
return __result;
}
Этот вывод позволяет упростить тестовый пример дажеподробнее:
#include <filesystem>
int main(void)
{
const std::filesystem::path first = "/tmp";
const std::filesystem::path second(first);
return 0;
}
, что дает понять, что проблема заключается в вызове конструктора копирования.
Единственный vector
в std::filesystem::path
- это этот вектор (предположительно, из компонентов пути).):
/usr/include/c++/8/bits/fs_path.h
struct _Cmpt;
using _List = _GLIBCXX_STD_C::vector<_Cmpt>;
_List _M_cmpts; // empty unless _M_type == _Type::_Multi
В соответствии с трассировкой стека, при копировании этого вектора мы сразу попадаем в stl_vector.h
:
/usr/include/c++/8/bits/stl_vector.h
vector(const vector& __x)
: _Base(__x.size(),
_Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
{
но если мы напечатаем значение __n
в конструкторе _Vector_base
здесь:
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
, мы получим какое-то безумно большое число, что заставляет меня думать, чтоневерный вектор __x
был каким-то образом передан конструктору копирования.
Теперь, почему это происходит, когда вы объединяете g ++ - 8 с библиотеками g ++ - 9, я понятия не имею (пока) и я 'Я предполагаю, что нужно идти на один уровень глубже, если им нужно понять истинную причину.
Но я думаю, что ответ на ваш главный вопрос звучит так: «Проблема вызвана несовместимостью версий вашего компилятора и библиотеки»:)