【C++ troubleshooting】A case about decltype
template <typename iter_t>
bool next_permutation(iter_t beg, iter_t end) {
//
    if (beg == end || beg + 1 == end) {
        return false;
    }
    //在白板上写代码别忘了加 }
    for (int *i = end - 2; i >= beg; --i) {
        auto iter = std::lower_bound(i + 1, end, *i, std::greater<decltype(*beg)>{});
        if (iter != i + 1) {
            std::swap(*(iter - 1), *i);
            std::reverse(i + 1, end);
            return true;
        }
    }
    return false;
}
ptr_t ptr;
*ptr;
As we know, in C++, for a variable ptr of a pointer (or iterator) type, the expression *ptr returns a reference to the object that ptr points to.
Suppose the object that ptr points to is of type T, then decltype(*ptr) will yield the type T&.
So, in the above code, the line
auto iter = std::lower_bound(i + 1, end, *i, std::greater<decltype(*beg)>{});
becomes
auto iter = std::lower_bound(i + 1, end, *i, std::greater<int&>{});
when the function template next_permutation is instantiated.
However, such an instantiation of std::lower_bound will not compile.
Let's see the compile error:
In file
.../include/c++/8.3.0/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_comp_val::operator()(_Iterator, _Value&) [with _Iterator = int*; _Value = const int; _Compare = std::greater<int&>]':
.../include/c++/8.3.0/bits/predefined_ops.h:177:11: error: no match for call to '(std::greater<int&>) (int&, const int&)'
{ return bool(_M_comp(*__it, __val)); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file
.../include/c++/8.3.0/bits/predefined_ops.h:177:11:error: binding reference of type 'int&' to 'const int' discards qualifiers
{ return bool(_M_comp(*__it, __val)); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~
将其中提到的函数片段,还原如下
  template<typename _Compare>
    struct _Iter_comp_val
    {
      _Compare _M_comp;
      // constructors
      template<typename _Iterator, typename _Value>
	bool
	operator()(_Iterator __it, _Value& __val)
	{ return bool(_M_comp(*__it, __val)); }
    };
这个问题我还没搞懂。
【C++ troubleshooting】A case about decltype的更多相关文章
- 【原创翻译】The Case for the Reduced Instruction Set Computer
		RISC机的例子 David A. Patterson 加州大学伯克利分校计算机科学系 David R. Ditzel 贝尔实验室计算科学研究中心 介绍 计算机体系结构最主要的目标之一就是设计比之前产 ... 
- 【35.37%】【codeforces 556C】Case of Matryoshkas
		time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- 【66.47%】【codeforces 556B】Case of Fake Numbers
		time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- 【52.49%】【codeforces 556A】Case of the Zeros and Ones
		time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ... 
- 【深入浅出jQuery】源码浅析--整体架构
		最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ... 
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
		一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ... 
- 搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
		现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以). 优点: 1.开源.轻量.小巧.上手容易. 2.支持的数据库还蛮多的, Mysql,S ... 
- MongoDB【第一篇】MongodDB初识
		NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ... 
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
		通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ... 
随机推荐
- 简易的vuex用法
			vuex是vue中用于管理全局状态的一个组件,用于不同组件之间的通信,下面将介绍它的简单用法 首先安装vue与vuex npm install vue npm install vuex --save ... 
- Node.js(一)----安装
			1.下载 地址 https://nodejs.org/en/download/ 注: 系统为ubuntu 下载的源码包 tar.gz 或者 wget https://nodejs.org/dist/v ... 
- x-pack本地安装方式
			一.首先下载本地安装包,我使用的ELK是5.6.1版本: https://artifacts.elastic.co/downloads 二.进入到elasticsearch/bin(所有节点)和kib ... 
- Kubernetes-tutorials(五)
			The tutorials use Katacoda to run a virtual terminal in your web browser that runs Minikube, a small ... 
- R语言学习笔记(九):fivenum()与quantile()
			fivenum() fivenum(x, na.rm = TRUE) x 为数值型向量,可以包含NA以及Inf,-Inf na.rm = TRUE 默认将NA和NaN去除,但是Inf还保留. five ... 
- maven中settings文件的配置
			鉴于上一个博客写的maven打包,读者老爷们可能找不到settings文件的配置,这里专门附上settings文件的配置: 有的settings文件只含有一些空标签,需要手动去配置. <?xml ... 
- 初步学习pg_control文件之十四
			接前文 初步学习pg_control文件之十三 看如下几个: /* * Parameter settings that determine if the WAL can be used for arc ... 
- CSS3实现3D球体旋转动画
			html <div class="ball-box"> <div class="ball"> <div class="l ... 
- java Spring boot使用spring反射
			spring 反射 当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行. 1.可以通过类名去实例 ... 
- 当我们访问不了虚拟机上ip上的web页面,是因为在window上要添加映射
			在主机上添加映射步骤 1.打开C盘 注意:用nopedata++打开 保存即可! 
