C++:decltype
简介
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) -