1.问题引出

最近在新的环境上编译以前使用过boost的c++程序,发现对boost的相关调用部分报错了,而且报错发生在boost的内部的hpp文件中

报错内容:cannot bind rvalue reference of type to lvalue of type

通过实际查看boost报错部分的代码,发现报错部分的代码类似于这样:

main.cpp:

#include <stdio.h>template<typename T>
void f1(const T&& a)
{printf("f1:%d\n",a);
}void f2(const int & e)
{f1<const int>(e);
}int main()
{int a = 10;f2(a);return 0;
}

编译:g++ main.cpp -o main

编译报错,提示:

error: cannot bind rvalue reference of type 'const int &&' to lvalue of type 'const int'

在这一行:f1<const int>(e)

报错与boost中一致

2.右值引用

编译提到了右值引用(rvalue reference),说明默认使用了g++11新特性,在g++11的新特性里面,加入了右值引用

右值引用:即(Move Semantics:移动语义),避免无意义的拷贝赋值操作,C++11提出右值引用的概念,其本质是接替右值的所有权(不销毁原先的内存内容,而是将所有权移交给被交付的对象。)。

int &&value = 1    ;//右值引用一个常量值
int &&value = fun();//右值引用一个临时的函数返回值
相对于左值,右值的生命周期很短,如函数的临时返回值,可以安全的转移控制权。
将右值的资源不释放,而是采取右值引用的方式继续使用,减少大量的拷贝,复制带来的开销。
编译器会默认开启返回值优化,解决重复对象构造问题,而采取右值引用可以语言层面实现。

子中的问题出在,右值引用专门是用来引用右值的,不可以引用左值,而f2函数中的e,是个左值引用,其不可以传给右值引用,

类似于:

int a = 2;
int &&b = 3;//可以,右值引用的就是3
int &&c = a;//不可以,右值引用不能引用左值,而a是个左值

3.解决方式

要解决boost的这个编译报错,不想禁用g++的c++11功能,又不能改变boost中的那部分报错代码,因为按照对boost的调用情况,确实会走到报错代码的地方,那是什么原因会让上层传下来的参数最后变成了编译会出错的右值引用呢?在boost的config.hpp中,会有一些列检查当前机器环境的宏,由于机器环境的不同,某些宏会被意外打开或是关闭,导致出现了宏分支。通过查看config.hpp中的宏开关,发现在当前程序中,通过定义BOOST_ASIO_DISABLE_MOVE宏,就可以关掉config.hpp中的宏走向,这样禁止了意外使用右值引用的情况。

boost中cannot bind rvalue reference of type to lvalue of type问题相关推荐

  1. boost中bind的使用

    最近对boost的bind部分比较感兴趣,对其背后的机制进行了简单的分析,和大家分享一下. 注,我所看的代码是boost_1_64_0, 想来各个版本的差异不大. 定义函数 [cpp] view pl ...

  2. c语言中字符串关于左值,关于左值lvalue和右值rvalue的一点理解

    发现很多朋友对"lvalue"和"rvalue"理解有误,我先谈谈自己对此的一些理解,并期望能够引起更多朋友的广泛讨论.也算起到抛砖引玉的作用吧.引用:注:这里 ...

  3. leetcode报错runtime error: reference binding to null pointer of type ‘std::vector<std::__cxx11::basic_

    leetcode报错:runtime error: reference binding to null pointer of type 'std::vector<std::__cxx11::ba ...

  4. LeetCode报错:Line 923: Char 9: runtime error: reference binding to null pointer of type ‘std::__cxx11:

    LeetCode报错 报错原因: Line 923: Char 9: runtime error: reference binding to null pointer of type 'std::__ ...

  5. C++ for循环警告:Missing reference in range-for with non trivial type (QString)

    在qtcreator 中写了一个for循环,提示警告:Missing reference in range-for with non trivial type (QString) 如下图: 代码如下: ...

  6. boost中的数据类型转换之lexical_cast

    概述 C++程序中数据类型转换是十分常用的操作,本文介绍如何使用boost库来实现数据类型的转换. lexical_cast boost中通过boost::lexical_cast一系列模板函数来实现 ...

  7. java reference_java中的4种reference的差别和使用场景(含理论、代码和执行结果)...

    JDK 1.2之后,对引用进行了扩充,引入了强.软.若.虚四种引用,被标记为这四种引用的对象,在GC时分别有不同的意义: a> 强引用(Strong Reference).就是为刚被new出来的 ...

  8. [C++] Lvalue and Rvalue Reference

    Lvalue and Rvalue Reference int a = 10;// a is in stack int& ra = a; // 左值引用 int* && pa ...

  9. Line 923: Char 9: runtime error: reference binding to null pointer of type ‘int‘ (stl_vector.h)

    Leetcode 报错 Line 923: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_ve ...

最新文章

  1. mysql 设置 0、1 用什么数据类型_MySQL索引的基本使用
  2. es存在某个字段的查阅_ElasticSearch系列02:ES基础概念详解
  3. Log4j 1使用教程
  4. 学术词汇 | Ablation Test or Ablation Experiment
  5. 北京科技大学计算机控制大作业,北京科技大学计算机控制系统实验报告
  6. Coolite中的ComboBox控件示例
  7. ad15的stc元件库_altium designer常用元件库和封装库下载-非常全面初学者有福了
  8. 尚硅谷大数据之数据质量管理
  9. 【小程序】自定义组件设置样式失效使用外部样式类解决
  10. Canvas-2d fillRect
  11. MySQL: Incorrect string value: '\xF0\xA4\xBD\x82'分析解决
  12. python如何收集数据库_python 整理web数据库
  13. Backtrader(十一) - Indicator指标
  14. win7笔记本电脑安装ubuntu18.04双系统配置过程记录
  15. 苹果手机隐私分析数据是什么_苹果和谷歌可能是我们在隐私操作系统上的最佳选择...
  16. Unity模糊远处物体,近处清晰,景深效果
  17. Lustre是开放源代码的集群文件系统
  18. 视频教程-学校网管员培训视频教程-网络技术
  19. 编写软件第一个插件(Hello World)
  20. 彻底关掉win10自动更新_WIN10 常用设置收集 便利方法收集

热门文章

  1. ET框架-15 Actor消息的编写 以及 ET框架实战之前的准备工作
  2. 可靠的网络兼职,这四种兼职骗子很多,要警惕!
  3. 内向者优势 原版_如果你是一个优柔寡断、性格内向的女生,建议从事这4种工作...
  4. Friends 人物简介
  5. 怎么用命令查看服务器状态,服务器操作中的常用命令
  6. python调用js批量爆破账号密码
  7. Java 连接 Access 数据库
  8. MPI(OpenMPI和MPICH(IntelMPI、MVAPICH))和OpenMP
  9. Nginx 安装及模块配置
  10. ADV-168贪吃的大嘴