深入理解 C++ 右值引用 Shepard-Wang

零 如何打印出一个变量的类型

1、typeid(variable).name()

int main()
{
    string s = "123";
    const string &rs = s;

    cout << typeid(s).name() << " " << typeid(rs).name() << endl;
    
    return 0;
}

使用 typeid 我们查看输出的结果为:

NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

这是变量类型经过 mangling 后的结果,可以通过 c++filt -t 命令得到真实的类型:

c++filt -t NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >

发现 srs 被解释为同种类型!

2. 借助 __PRETTY_FUNCTION__

__PRETTY_FUNCTION__ 可以用来打印函数签名(gcc),msvc 则为 __FUNCSIG__