c++查看运行时类型

devtools/2024/10/23 22:58:37/

c++查看运行时类型方法有三:

visual studio的监视

c++98查看运行时类型

#include <typeinfo>
#include <iostream>
using namespace std;
int main()
{int i = 0;cout << typeid(i).name() << endl;//intcout << (typeid(i) == typeid(int)) << endl;//1return 0;
}

gcc输出typeid::name();类型的缩写,vs2015可以输出明文的类型字符串,但是无法区分const和&。

Boost::TypeIndex库输出运行时类型

当前库的版本boost_1_67_vs2015

#include <iostream>
#include "boost/type_index.hpp"
using namespace std;
template<typename T>
void f(const T& param)
{using boost::typeindex::type_id_with_cvr;cout << "T=" << type_id_with_cvr<T>().pretty_name() << endl;cout << "param=" << type_id_with_cvr<decltype(param)>().pretty_name() << endl;cout << endl;
}
template<typename T>
void f( T& param)
{using boost::typeindex::type_id_with_cvr;cout << "T=" << type_id_with_cvr<T>().pretty_name() << endl;cout << "param=" << type_id_with_cvr<decltype(param)>().pretty_name() << endl;cout << endl;
}template<typename T>
void f(T&& param)
{using boost::typeindex::type_id_with_cvr;cout << "T=" << type_id_with_cvr<T>().pretty_name() << endl;cout << "param=" << type_id_with_cvr<decltype(param)>().pretty_name() << endl;cout << endl;
}
int main()
{int i = 1;const int& j = i;int* k = &i;f(i);f(j);f(k);f(1);return 0;
}

问题,那个准确?

新建hello world程序

#include <iostream>
using namespace std;
class X{};
void g(X&& val) {}
void f(X&& val) {//g(std::move(val));//g(val);//error C2664: “void g(X &&)”: 无法将参数 1 从“X”转换为“X &&”//visual studio watch:X&&cout << typeid(val).name();//class Xint a = 1;
}
void main()
{X x;auto a = std::move(x);//visual studio watch:Xcout << typeid(a).name();//class Xf(std::move(x));
}

右值定义‌

右值是指那些无法获取到内存地址的值,一般出现在赋值语句的右边,如字面值常量、表达式结果、临时对象等。它们通常不具名,因此无法直接通过变量名来引用。

为什么函数参数类型为&&会自动变成非常量左值?

这是因为,在函数参数列表中,无论是左值引用还是右值引用,参数名都代表了一个在函数作用域内有效的变量。这个变量在函数内部可以被修改、读取,甚至它的地址也可以被获取(尽管对于右值引用来说,获取地址并不是常见的操作,因为通常右值引用绑定的是临时对象或不可寻址的值)。 

  • 右值引用‌:在函数参数列表中,Type&&表示这是一个右值引用参数,它可以绑定到右值上(包括临时对象、返回值优化产生的对象等)。

  • 在函数内部作为左值处理‌:一旦参数被传递给函数,无论它是左值引用还是右值引用,在函数内部它都被视为一个左值。这意味着你可以像处理任何其他左值一样来处理它(例如,修改它的值、调用它的成员函数等)。


http://www.ppmy.cn/devtools/128283.html

相关文章

力扣71~75题

题71&#xff08;中等&#xff09;&#xff1a; python代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:#首先根据/分割字符串&#xff0c;再使用栈来遍历存储p_listpath.split(/)p_stack[]for i in p_list:#如果为空则肯定是//或者///if i:con…

计算机网络自顶向下(3)---TCPsocket

1.TCPsocket TCPsocket是指使用传输控制协议&#xff08;TCP&#xff09;的网络套接字。套接字是网络中两台计算机之间进行通信的端点。TCP是一种可靠的、面向连接的协议&#xff0c;提供了错误检测、流量控制和拥塞控制等功能。 TCPsocket通常用于客户端-服务器通信&#xff0…

【软件测试】理论杂记 + Selenium

文章目录 测试用例万能公式基于测试对象黑盒测试方法 白盒测试Selenium选择器CSS选择器XPath选择器 等待常用API浏览器操作 测试用例万能公式 功能&#xff0c;界面&#xff0c;易用&#xff0c;兼容&#xff0c;安全&#xff0c;性能&#xff0c;网络 基于测试对象 界面测试…

Greiner 经典力学(多体系统和哈密顿力学) 第十章 学习笔记

第十章 学习笔记 &#xff08;The Virbrating Membrane&#xff09; 这一章研究的是一个薄膜的振动问题。基本假设条件与上一章类似。 首先是振动幅度很小。 薄膜的张力 T 认为是恒定的。 类似弦振动问题推导&#xff0c;将其推广到二维平面上&#xff0c;就可以得到膜的振…

RAPIDS cuDF pandas

使用 RAPIDS cuDF pandas 加速器模式处理 10 亿行数据 文章目录 前言一、使用 RAPIDS cuDF pandas 加速器模式进行数据处理二、RAPIDS cuDF pandas 加速器模式下的新大型数据处理功能 24.081. 大字符串支持2. 带预提取的托管内存池三、使用 NVIDIA GPU 运行一亿行挑战赛1. NVID…

用Java爬虫API,轻松获取电商商品SKU信息

在电子商务的精细化运营时代&#xff0c;SKU信息的重要性不言而喻。SKU&#xff08;Stock Keeping Unit&#xff09;信息不仅包含了商品的规格、价格、库存等关键数据&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。如何高效、准确地获取这些信息&#xff0…

万能接口PCIE

一、PCIE插槽的崛起 随着计算机技术的飞速发展&#xff0c;主板上的扩展插槽也在不断演进。PCIE插槽&#xff0c;作为新一代的高速串行扩展总线标准&#xff0c;已经逐渐取代了早期的PCI和AGP插槽&#xff0c;成为现代主板上的主流扩展接口。 二、PCIE插槽的特性 高速串行传…

vue3中使用element-plus的组件,编辑器检查警告爆红找不到名称相关的element组件

1.首先是使用elementPlus的自动导入 在vite.config.js中配置 import { defineConfig } from "vite"; import path from path import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; imp…