C++ 引用型别未定义

文章讨论了C++中的引用类型,特别是左值引用和右值引用。在函数模板中,由于左值引用的万能引用特性,可能导致传入的右值被误识别为左值。为了解决这个问题,文章介绍了C++的完美转发概念,通过`std::forward`来确保参数的原始类型得到正确处理。示例代码展示了如何使用完美转发来改进`function`模板,使其能正确调用`Print`函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是引用型别未定义呢?(首先是基本数据类型的)

        在使用函数的时候,我们在给函数传参的时候可能会传入一个左值也可能是右值。当我们使用如下函数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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值