c++11 - 为什么 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`
而且我无法理解它背后的输出逻辑,谁能解释为什么它会给出这样的输出?并提前感谢
解决方案
那是类型名称的“名称错位”版本it
。typeinfo::name()
标准不要求以人类可读的格式返回名称(恕我直言的缺点),并且 GCC 不这样做。
要获得实际的、人类可读的名称,您需要调用abi::__cxa_demangle()
GCC 提供的函数,但请注意这是不可移植的,因此如果您的项目需要在不同的编译器上工作,您需要适当地包装它。
推荐阅读
- aws-lambda - AWS Lambda 同时触发数千次
- java - 我们可以强制一个泛型类型接受它的参数化类型作为一个类型的具体子子类而不是那个类型本身
- sql - 从具有关键约束的两个不同表中获取重复行的列表
- python - 在以 UTF-8 编码写入 CSV 后,撇号显示为 ΓÇÖ
- c# - HTTP 请求的字段转换注解
- whm - 如何在 putty 中使用 SSH 命令查找和读取 www.conf 文件?
- php - 访问另一个数组中的数组值
- android - 移除布局背景
- google-cloud-platform - 由于缺少服务帐户,无法部署云功能
- selenium - Selenium IDE Web 驱动程序在可见确认中选择 ok