Тип возвращаемого значения в имени функции-члена

В чем причина 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

Есть ли способ получить согласованное поведение, то есть получить также возвращаемое значение для функций-членов?

3

Решение

Упорядочивание / разбор имен функций выходит за рамки стандарта C ++. Это просто ответственность компилятора и необходимость манипулировать функциями таким образом, чтобы две разные функции имели разные искаженные представления (символы).

В то же время, поскольку объявление двух функций, отличающихся только типом возврата, запрещено Стандартом, компилятору не нужно манипулировать типом возврата, так как не будет никакой выгоды.

То, что вы видите, является лишь следствием того, что компилятор достаточно ленив.

Кроме того, вот rextester с более полным примером (включая глобальную функцию в обратном следе).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]