首页 > 解决方案 > 为什么 auto 变量的输出显示与类型无关的内容?

问题描述

我尝试了一个关于 Auto 的示例,用于 C++ 中的变量初始化和 STL。对于普通变量,使用 : 打印类型typeid(var_name).name()以打印i (integer) / d(float) / pi(pointer)工作正常。但在研究 STL 时,

`#include <iostream>
 #include <vector> 
 using namespace std;

 int main() 
 { 
    vector<string> st; 
    st.push_back("geeks");
    st.push_back("for"); 

    for (auto it = st.begin(); it != st.end(); it++) 
        cout << typeid(it).name() << "\n"; 

    return 0; 
} 
`
which gives output like,
`N9__gnu_cxx17__normal_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIS6_SaIS6_EEEE
N9__gnu_cxx17__normal_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIS6_SaIS6_EEEE`  

而且我无法理解它背后的输出逻辑,谁能解释为什么它会给出这样的输出?并提前感谢

标签: c++11auto

解决方案


那是类型名称的“名称错位”版本ittypeinfo::name()标准不要求以人类可读的格式返回名称(恕我直言的缺点),并且 GCC 不这样做。

要获得实际的、人类可读的名称,您需要调用abi::__cxa_demangle()GCC 提供的函数,但请注意这是不可移植的,因此如果您的项目需要在不同的编译器上工作,您需要适当地包装它。


推荐阅读