declval 和decltype


假设有这么一个场景,你需要得到某类型中某函数返回值的类型,然而该函数并没有构造函数:
struct Default 
{
    Default(const Default &d) {}
    int foo() const 
{ return 1; }
};
int main() 
{
    decltype(std::declval<Default>().foo()) n1 = 1;
    //decltype(Default.foo()) n1 = 1; //Default没有构造函数, decltype里面需要是可以计算的表达式
    return 0;
}

 

转载于:https://www.cnblogs.com/abelian/p/7065086.html

`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 来简化代码编写过程,并且提高程序灵活性复用度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值