首页 > 编程语言 >C++ 左值引用和右值引用之间的转换

C++ 左值引用和右值引用之间的转换

时间:2024-11-13 22:41:15浏览次数:1  
标签:const 右值 int 左值 引用 &&


int retVal(int &&v)
{
    cout << "右值引用:";
    return v;
}

int retVal(int &v)
{
    cout << "左值引用:";
    return v;
}

int retVal(const int &v)
{
    cout << "const 左值引用:";
    return v;
}

int getVal()
{
    return 999;
}


// 主函数
int main()
{
    int a = 100;
    int &b = a;
    
    cout << retVal(static_cast<int &&>(a)) << endl;
    cout << retVal(static_cast<int &&>(b)) << endl;
    cout << retVal(110) << endl;

    system("pause");
    return EXIT_SUCCESS;
}

输出:

右值引用:100
右值引用:100
右值引用:110
请按任意键继续. . .

可见,上面三个输出,都是精准匹配到的是int retVal(int &&v)函数。另外左值或左值引用可以通过static_cast<int &&>()强转成右值类型(这个是 std::move 的基础?);反过来右值不能通过static_cast<int &>()转成左值引用。如,cout << retVal(static_cast<int&>(getVal())) << endl; 这样子会报错。

下面我们注释掉右值函数:


//int retVal(int &&v)
//{
//    cout << "右值引用:";
//    return v;
//}

int retVal(int &v)
{
    cout << "左值引用:";
    return v;
}

int retVal(const int &v)
{
    cout << "const 左值引用:";
    return v;
}

int getVal()
{
    return 999;
}

NS_END

int main()
{
    int a = 100;
    int &b = a;
    
    cout << retVal(static_cast<int &&>(a)) << endl;
    cout << retVal(static_cast<int &&>(b)) << endl;
    cout << retVal(110) << endl;

    system("pause");
    return EXIT_SUCCESS;
}

输出:

const 左值引用:100
const 左值引用:100
const 左值引用:110
请按任意键继续. . .

可见,编译器匹配到的是int retVal(const int &v)函数。也就是说,int && 可以转换成const int &v类型。经测试,不能转换成int &v类型。

所以,一般会重载两个函数,一个是右值引用参数,另一个是 const 左值引用参数。——《C++ Primer》 P482

标签:const,右值,int,左值,引用,&&
From: https://www.cnblogs.com/huvjie/p/18544986

相关文章

  • jvm 五种常见的对象引用
    -------------------------------------------------------------------------------软引用: ------ ---------------- -----------------------------------------------------------------------------------------------------------------弱引用: --------------......
  • 《深度解析 C++中的弱引用(weak reference):打破循环依赖的利器》
    在C++编程的世界里,内存管理一直是一个关键且复杂的话题。而弱引用(weakreference)的出现,为我们处理一些特殊的内存相关问题提供了一种巧妙的方法。今天,我们就来深入了解一下什么是弱引用。一、从引用的基本概念说起我们都知道,在C++中,引用是一种给变量起别名的方式。正常......
  • C++函数传递引用或指针
    常见变量用法下面通过例子分别展示传递值、字符串、数组的用法示例代码#include<iostream>#include<string>//函数接受一个整数的引用和一个整数的指针voidmodifyValue(int&refValue,int*ptrValue){refValue=100;//通过引用修改值std::cout......
  • 在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定
    在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定位和调用系统中已经存在的记录。ref的全称是reference,可以通过该函数引用特定的视图、字段、模型等元素,从而在模块开发中实现跨文件、跨模块的引用。下面我会详细解释ref的作用,并提供丰富的示例......
  • SAM4MLLM:结合多模态大型语言模型和SAM实现高精度引用表达分割 | ECCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:SAM4MLLM:EnhanceMulti-ModalLargeLanguageModelforReferringExpressionSegmentation论文地址:https://arxiv.org/abs/2409.10542论文代码:https://github.com/AI-Application-and-Integration-Lab/SAM4MLLM创......
  • 【JAVA基础】JAVA中是值传递还是引用传递?
    JAVA中是值传递还是引用传递?基本数据类型的值传递引用类型的值传递在Java中,参数传递实际上是通过值传递(pass-by-value)来实现的,但这一点在理解时可能会因为对象的存在而显得有些复杂。为了详细解释这一点,我们需要区分基本数据类型(如int,char,boolean等)和引用类型(如......
  • c++ 对于传递引用和传递值的理解
    首先先上一段c++代码,可以看出foo函数参数是引用类型,bar函数参数是值类型typedefstructA{intx;inty;}A;voidfoo(A&a){ra.x++;}voidbar(Aa){a.x++;}intmain(){Aa={1,2};foo(a);bar(a);return0;}在vscode......
  • 关于右值引用测试
    不论在win:vs,gcc测试,使用RightValue,性能出现下降  在Llvm下,使用RightValue,性能也出现下降: 测试参考之前的博客代码,现有的代码也可以:#include<iostream>#include<vector>#include<utility>#include<chrono>usingnamespacestd;usingnamespacestd::chrono;......
  • Java Pom 两个模块需要互相引用怎么办
    JavaPOM模块化是什么在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。1.1POM(P......
  • Java Pom 两个模块需要互相引用
    JavaPOM模块化是什么在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。1.1POM(P......