C++:decltype

本文详细介绍了C++中的decltype类型说明符,包括其用途、语法、参数、返回值等,并通过示例展示了decltype在模板函数、转发函数中的使用,强调了其在确定表达式类型和完美转发中的重要性。同时还提到了decltype(auto)在C++14中的引入及其要求的编译器版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

decltype 类型说明符将生成指定表达式的类型。 decltype 类型说明符与 auto 关键字一起主要用于编写模板库的开发人员。 使用 auto 和 decltype 来声明其返回类型依赖于其模板参数类型的模板函数。 或者,使用 auto 和 decltype 来声明一个模板函数,该函数包装对其他函数的调用,然后返回包装函数的返回类型。

语法

decltype(表达式)

parameters

表达式
一个表达式。

返回值

表达式 参数的类型。

备注

decltype Visual Studio 2010 或更高版本中支持类型说明符,可与本机代码或托管代码一起使用。 Visual Studio 2015 及更高版本支持 decltype(auto) (C++14)。

编译器使用以下规则来确定 expression 参数的类型。

如果 expression 参数是标识符或 类成员访问, decltype(expression) 则是按 expression 命名的实体的类型。 如果没有此类实体或 表达式 参数命名一组重载函数,则编译器将生成错误消息。

如果 expression 参数是对函数或重载运算符函数的调用, decltype(expression) 则是函数的返回类型。 将忽略重载运算符两边的括号。

如果 expression 参数是 右值, decltype(expression) 则为 表达式 的类型。 如果 expression 参数是 左值, decltype(expression) 则是对 表达式 类型的 左值引用。

下面的代码示例演示了如何使用 decltype 类型说明符。 首先,假定已编码下列语句。

int var;
const int&& fx();
struct A {
    double x; }
const A* a = new A();

接下来,检查下表中四个语句返回的类型 decltype 。
在这里插入图片描述
Decltype 和 Auto
在 c + + 14 中,可以使用 decltype(auto) 不带尾随返回类型的来声明其返回类型依赖于其模板参数类型的模板函数。

在 c + + 11 中,可以对 decltype 尾随返回类型使用类型说明符以及 auto 关键字,以声明其返回类型依赖于其模板参数类型的模板函数。 例如,考虑下面的代码示例,其中模板函数的返回类型取决于模板参数类型。 在代码示例中, 未知 占位符指示无法指定返回类型。

template<typename T, typename U>
UNKNOWN func(T&& t, U&& u){
    return t + u; };

引入 decltype 类型说明符使开发人员能够获取模板函数返回的表达式的类型。 使用以后显示的 替代函数声明语法 、 auto 关键字和 decltype 类型说明符来声明 后期指定 的返回类型。 后指定返回类型是在对声明进行编译而不是编码时确定的。

以下原型阐述一个替代函数声明的语法。 请注意, const 和 volatile 限定符以及 throw 异常规范 都是可选的。 Function_body 占位符表示指定函数作用的复合语句。 作为最佳编码做法,语句中的 表达式 占位符 decltype 应与 return function_body 中的语句(如果有)指定的表达式匹配。

autofunction_name (参数opt opt opt ) const volatile -> decltype( 表达式 ) noexcept opt { function_body};

在下面的代码示例中,myFunc 模板函数的后指定返回类型取决于 t 和 u 模板参数的类型。 作为最佳编码做法,该代码示例还使用右值引用和 forward 支持 完美转发 的函数模板。

//C++11
template<typename T, typename U>
auto myFunc(T&& t, U&& u) -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值