我已经尝试过最小的测试用例。这个案例通过 devtoolset-4 (gcc-5.2) 在 rhel-7 上通过,在 rhel-6 下失败。状态 -2 表示“mangled_name 不是 C++ ABI 重整规则下的有效名称。” https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html
我做错了还是如果我想在 RHEL-6 上使用 gcc-5.2,我将不得不以某种方式解决这个错误?如果是这样,有什么建议吗?到目前为止,我最好的想法是将重整名称中的“IJ”正则表达式为“II”,然后再将其提供给 __cxa_demangle()。如果这可能是相对可靠的,我可以忍受它。
#include <iostream>
#include <string>
#include <tuple>
#include <typeinfo>
#include <cxxabi.h>
#define DUMP(x) std::cout << #x << " is " << x << std::endl
template<typename T>
void print_type(T t)
{
int status;
auto name = typeid(t).name();
DUMP(name);
auto thing2 = abi::__cxa_demangle(name, 0, 0, &status);
if(status == 0)
{
DUMP(thing2);
}
else
{
std::cout << typeid(t).name() << " failed to demangle\n";
DUMP(status);
}
}
typedef std::tuple<foo_t, foo_t> b_t;
int main(int argc, char **argv)
{
std::tuple<bool, bool> t;
print_type(t);
}
Centos-6 输出
name is St5tupleIJbbEE
St5tupleIJbbEE failed to demangle
status is -2
Centos-7 输出
name is St5tupleIJbbEE
thing2 is std::tuple<bool, bool>
带有 devtoolset-3 (gcc-4.9) 的 Centos-6 输出
name is St5tupleIIbbEE
thing2 is std::tuple<bool, bool>