c++11::std::decltype/declval
decltype ( 实体 ) () (C++ 起)
decltype ( 表达式 ) () (C++ 起)
若实参是其他类型为 T 的任何表达式,且
a) 若 表达式 的值类别为亡值,则 decltype 产生 T&&;
b) 若 表达式 的值类别为左值,则 decltype 产生 T&;
c) 若 表达式 的值类别为纯右值,则 decltype 产生 T。 int a;
double d;
float f; decltype(a) aa;
cout << typeid(aa).name() << endl; //int
decltype(d) dd;
cout << typeid(dd).name() << endl;//double
decltype(f) ff;
cout << typeid(ff).name() << endl;//float template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回类型依赖于模板形参
{ // C++14 开始可以推导返回类型
return t+u;
}
decltype应用场景:decltype多应用在泛型编程之中
template<typename T> class
{
typename T::iterator it;
void func(T t)
{
it = t.begin(); //这里取它迭代器的首位置
}
}; template<typename T> class
{
typename T::const_iterator it;
void func(T t)
{
it = t.begin(); //这里取它迭代器的首位置
}
}; 使用decltype,上面的代码可以写成
template<typename T> class
{
decltype(T.begin()) it;
void func(T t)
{
it = t.begin(); //这里取它迭代器的首位置
}
}; 实际上,标准库中有些类型都是通过decltype来定义的:
typedef decltype(nullptr) nullptr_t;
typedef decltype(sizeof()) size_t;
函数模板
std::declval (c++11 only)
template<typename T>
typename add_rvalue_reference<T>::type declval() noexcept; 功能描述:
返回一个类型的右值引用,不管是否有没有默认构造函数或该类型不可以创建对象。(可以用于抽象基类);
struct A {
virtual int value() = ;
}; class B : public A {
int val_;
public:
B(int i, int j) :val_(i*j) {}
int value() { return val_; }
}; int main(void)
{
decltype(std::declval<A>().value()) a; // => int a
decltype(std::declval<B>().value()) b; // => int b decltype(B(, ).value()) c;
cout << typeid(c).name() << endl; a = b = B(, ).value();
std::cout << a << std::endl;
system("pause");
return ;
}
c++11::std::decltype/declval的更多相关文章
- C++11的decltype关键字
C++11的decltype关键字 概述 decltype关键字和auto有异曲同工之处 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了 ...
- c++11 之 decltype
在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能) ...
- c++11——auto,decltype类型推导
c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率. auto和decltype的类型推导都是编译器在 ...
- C++11中decltype的使用
The decltype type specifier yields the type of a specified expression. The decltype type specifier, ...
- C++11 std::function用法
转自 http://www.hankcs.com/program/cpp/c11-std-function-usage.html function可以将普通函数,lambda表达式和函数对象类统一起来 ...
- C++11 std::copy
这个函数并不是简单的 while(first != last) { *result = *first; result++; first++; } 事实上这种写法是最具普适性的,值要求inputIter ...
- C++11 std::move和std::forward
下文先从C++11引入的几个规则,如引用折叠.右值引用的特殊类型推断规则.static_cast的扩展功能说起,然后通过例子解析std::move和std::forward的推导解析过程,说明std: ...
- C++11 std::ref使用场景
C++本身有引用(&),为什么C++11又引入了std::ref(或者std::cref)? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用.如下例子: # ...
- C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...
随机推荐
- 松软科技课堂:SQL之NOTNULL约束
SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...
- 04.Django基础四之模板系统
一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...
- jquery的api以及用法总结-选择器
jQuery API及用法总结 选择器 基本选择器 * 通用选择器 .class 类选择器,一个元素可以有多个类(chrome使用原生js函数getElementByClassName()实现) 利用 ...
- 解决CentOS6.x或RedHat Linux 6.x版本不能通过System eth0以固定IP访问外网的问题
当你在VMware Workstation Pro中,打开从别人那里克隆来的系统,或者是开启迁移后的虚拟机系统时,VMware将会提示你:此虚拟机可能已被移动或 复制.为了配置特定的管理和网络功能.V ...
- Spring MVC-从零开始-未完待续
Spring MVC 之 json格式的输入和输出 Spring定时器简单使用 Spring mvc 拦截器的简单使用 Spring MVC文件上传
- jQuery常用方法(一)-基础
$("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test.jpg", ...
- Spring5源码解析-前奏:本地构建Spring5源码
构建环境 macOS 10.13.6 JDK1.8 IntelliJ IDEA 2018.3.6 (Ultimate Edition) Spring v5.1.9.RELEASE Gradle 5.5 ...
- Spring只定义接口自动代理接口实现类
能够扫描到包 @ComponentScan("org.zxp.esclientrhl") ESCRegistrar类主要实现ImportBeanDefinitionRegistra ...
- Python列表的深度排序
实例1:>>>L = [2,3,1,4]>>>L.sort()>>>L>>>[1,2,3,4] 实例2:>>> ...
- Java 学习笔记之 Thread运行过程分析
Thread运行过程分析: 以下是一个最普通的Thread实现过程,我们今天就来看仔细分析下他是如何运行的. public class ThreadRunMain { public static vo ...