什么是引用型别未定义呢?(首先是基本数据类型的)
在使用函数的时候,我们在给函数传参的时候可能会传入一个左值也可能是右值。当我们使用如下函数funtion的时候,会在控制台打印什么样的结果呢?(此时我们funtion接受的模板可以接收左值和右值)
void Print(int& x){
cout<<"int&"<<endl;
}
void Print(const int& y){
cout<<"const int&"<<endl;
}
void Print(int&& z){
cout<<"int&&"<<endl;
}
template<class T>
void funtion(T&& x){//引用型别未定义
Print(x);
}
int main() {
int a=10;
const int b=10;
funtion(a);
funtion(b);
funtion(10);
return 0;
}
结果有点意外,编辑器识别我们传入的右值识别为左值了。因为左值引用是万能引用,可以接受除他的const之外的所有类型。但如果我们需要识别为正确类型的话,我们又怎么办呢?C++为我们提供了方法:完美转发。只需要很少的代码,可以完成我们的需求。
//
// Created by 18751 on 2023/7/23.
//
#include<iostream>
using namespace std;
void Print(int& x){
cout<<"int&"<<endl;
}
void Print(const int& y){
cout<<"const int&"<<endl;
}
void Print(int&& z){
cout<<"int&&"<<endl;
}
template<class T>
void funtion(T&& x){
// Print(x);
Print(std::forward<T>(x));
}
int main() {
int a=10;
const int b=10;
funtion(a);
funtion(b);
funtion(10);
return 0;
}