В чем причина g ++ abi::__cxa_demangle
функция, чтобы не возвращать возвращаемое значение для функций-членов?
Вот рабочий пример такого поведения
#include <execinfo.h>
#include <cxxabi.h>
#include <iostream>
struct Foo {
void operator()() const
{
constexpr int buf_size = 100;
static void *buffer[buf_size];
int nptrs = backtrace(buffer, buf_size);
char **strings = backtrace_symbols(buffer, nptrs);
for(int i = 0; i < nptrs; ++i) {
auto str = std::string(strings[i]);
auto first = str.find_last_of('(') + 1;
auto last = str.find_last_of(')');
auto mas = str.find_last_of('+');
int status;
char* result = abi::__cxa_demangle(str.substr(first, mas-first).c_str(), nullptr, nullptr, &status);
if (status == 0) std::cout << result << std::endl;
}
}
};
int main () {
Foo f;
f();
}
и после компиляции с
g++ foo.cpp -std=c++11 -rdynamic
выход
Foo::operator()() const
Есть ли способ получить согласованное поведение, то есть получить также возвращаемое значение для функций-членов?
Упорядочивание / разбор имен функций выходит за рамки стандарта C ++. Это просто ответственность компилятора и необходимость манипулировать функциями таким образом, чтобы две разные функции имели разные искаженные представления (символы).
В то же время, поскольку объявление двух функций, отличающихся только типом возврата, запрещено Стандартом, компилятору не нужно манипулировать типом возврата, так как не будет никакой выгоды.
То, что вы видите, является лишь следствием того, что компилятор достаточно ленив.
Кроме того, вот rextester с более полным примером (включая глобальную функцию в обратном следе).
Других решений пока нет …