Тип возвращаемого значения в имени функции-члена
В чем причина 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
Есть ли способ получить согласованное поведение, то есть получить также возвращаемое значение для функций-членов?
1 ответ
Упорядочивание / разбор имен функций выходит за рамки стандарта C++. Это просто ответственность компилятора и необходимость манипулировать функциями таким образом, чтобы две разные функции имели разные искаженные представления (символы).
В то же время, поскольку объявление двух функций, отличающихся только типом возврата, запрещено Стандартом, компилятору не нужно манипулировать типом возврата, так как не будет никакой выгоды.
То, что вы видите, является лишь следствием того, что компилятор достаточно ленив.
Кроме того, вот реекстер с более полным примером (включая глобальную функцию в backtrace).