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&&
表示这是一个右值引用参数,它可以绑定到右值上(包括临时对象、返回值优化产生的对象等)。 -
在函数内部作为左值处理:一旦参数被传递给函数,无论它是左值引用还是右值引用,在函数内部它都被视为一个左值。这意味着你可以像处理任何其他左值一样来处理它(例如,修改它的值、调用它的成员函数等)。