Ответ 1
Обратите внимание, что стандартные библиотеки С++ настроены таким образом, что они встроят все шаблонные функции, которые могут быть разумно встроены, и нет настоящих функциональных копий. Так, например, когда вы идете на вызов std::vector<int>::begin()
, такой функции нет. Все его применения были встроены.
Вот почему вы получаете ошибки о "вызове функции... нет в целевой". Могут быть встроенные копии функции, но мы не можем позвонить. В качестве примера, если я создаю небольшую программу на С++, которая делает std::vector, и нажимает на нее некоторые элементы, а затем выполняет итерацию по ним, а затем делает:
(lldb) image lookup -r -n begin
2 matches found in /private/tmp/vector:
Address: vector[0x0000000100000eaf] (vector.__TEXT.__text + 1071)
Summary: vector`main + 1071 [inlined] std::__1::vector<int, std::__1::allocator<int> >::begin() at vector.cpp:12
vector`main + 1071 at vector.cpp:12 Address: vector[0x0000000100000eaf] (vector.__TEXT.__text + 1071)
Summary: vector`main + 1071 [inlined] std::__1::vector<int, std::__1::allocator<int> >::begin() at vector.cpp:12
vector`main + 1071 at vector.cpp:12
Итак, все экземпляры начального и конечного аксессуаров для std::vector<int>
встроены. И далее в части, которая поступает из самой библиотеки std c:
12 matches found in /usr/lib/libc++.1.dylib:
Address: libc++.1.dylib[0x000000000003e4ec] (libc++.1.dylib.__TEXT.__text + 252188)
Summary: libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin() Address: libc++.1.dylib[0x000000000003e51c] (libc++.1.dylib.__TEXT.__text + 252236)
Summary: libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin() const Address: libc++.1.dylib[0x000000000003e574] (libc++.1.dylib.__TEXT.__text + 252324)
и еще несколько для basic_string, и все. Поэтому нет реальных реализаций, которые мы можем назвать. Затем, когда у нас есть только реальный мир этих объектов std, доступных нам, мир разваливается другими странными способами, когда вы начинаете нажимать на него.
lldb в настоящее время недостаточно умен, чтобы понять, как восстановить шаблонную функцию/метод из файлов заголовков стандартной библиотеки С++. У нас недостаточно среды, в которой ваш код изначально был скомпилирован для выполнения этой задачи.
Обратите внимание, что это не проблема с перегруженными операторами, это скорее проблема с тем, как библиотеки std используются компилятором. Все должно работать лучше для ваших собственных классов, где при -O0 не так много вложений.