decltype和declval

decltypestd::declval在C++中都是用于类型推导的工具,但它们的使用方式和目的有所不同。

1.decltype:    decltype是一个类型推导关键字,它用于在编译时确定一个表达式或类型的类型。可以用它来获取一个变量、函数返回类型、或者任何表达式的类型,decltype`还可以用于模板编程,以推导模板参数的类型。decltype的结果是一个类型,而不是一个值。例如

int x = 10;  
decltype(x) y = 20;  // y的类型是int

2.declval: 

std::declval是一个函数模板,它并不真正返回一个值,而是产生一个引用到指定类型的假设值。它通常与decltype结合使用,以在不需要实际创建对象的情况下推导类型的值属性(例如,推导函数指针或成员函数指针的类型)。

std::declval的主要用途是在不实际创建对象的情况下确定类型的某些属性,这在模板元编程中特别有用,因为有时可能需要知道一个类型的某些属性,但又不想或不能创建该类型的实例。

例如,如果想检查一个类型是否有某个成员函数,可以使用std::declvaldecltype结合sizeof...操作符来实现:

template<typename T>  
struct has_begin_end  
{  
    template<typename C> static constexpr auto check(C*)   
        -> typename std::enable_if<  
            std::is_same<decltype(std::declval<C&>().begin()), decltype(std::declval<C&>().end())>::value,  
            std::true_type  
        >::type;  
  
    template<typename> static constexpr std::false_type check(...);  
  
    static constexpr bool value = decltype(check<T>(nullptr))::value;  
};

在这个例子中,std::declval被用于在不实际创建T类型对象的情况下检查beginend成员函数是否存在且返回类型相同。

总的来说,decltypestd::declval都是强大的类型推导工具,但它们的用途和上下文有所不同。decltype用于确定表达式或类型的类型,而std::declval则用于在不需要实际创建对象的情况下确定类型的某些属性。

`decltype` 是 C++11 引入的关键字,用于查询表达式的类型而不需要求值该表达式。它的主要用途是在编译期确定变量、表达式或返回类型的类型信息。 ### 使用场景: #### 1. 声明与现有表达式同类型的变量 ```cpp int a = 5; decltype(a) b = 6; //b 的类型为 int ``` 这里 `decltype (a)` 返回了 `a` 的类型 (`int`) 并用其声明新变量 `b`. #### 2. 获取复杂表达式的类型而不实际计算结果 例如, 对于函数调用: ```cpp template <typename T> T add(T x , T y){ return x + y ; } auto result_type = std::declval< decltype(add(10, 20)) >(); //不执行add(), 只获取其返回类型(int) ``` 注意上述例子中使用到了 `std::declval`, 它是辅助工具用来帮助获得类型但并不需要构造对象. #### 3. 在模板编程中的应用 在泛型编程里经常要用到自动推导参数的具体数据形式 : ```cpp template<typename Func, typename Arg> auto invoke(Func f, Arg arg)->decltype(f(arg)){ return f(arg); } //根据传入的实际f() arg 参数决定最终返回什么类型的数据. ``` #### 解释原理: 当编译器遇到 `decltype(expr)` 形式的语句时,会进行以下步骤处理: - 检查表达式 expr 是否有效(语法正确); - 不对 expr 进行任何运算操作; - 分析出 expr 所属的类别及修饰符(const/volatile等),并以此为基础构建新的 type descriptor; - 将此描述符作为整个 decltype 表达式的 "value" 输出; 因此,在很多情况下我们可以利用 decltype 来简化代码编写过程,并且提高程序灵活性复用度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值