decltype specifier

来自cppreference.com
< cpp‎ | language

 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
静态成员函数
模板
杂项
 
考察一个实体所声明的类型或查询表达式的返回类型.
原文:
Inspects the declared type of an entity or queries the return type of an expression.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 语法

decltype ( entity ) (1) (C++11起)
decltype ( expression ) (2) (C++11起)

[编辑] 解释

1)
如果参数是unparenthesised名称的对象/函数,或者是一个成员访问表达式(object.memberpointer->member),然后的decltype指定的声明的类型,该表达式指定的entity.
原文:
If the argument is either the unparenthesised name of an object/function, or is a member access expression (object.member or pointer->member), then the decltype specifies the declared type of the entity specified by this expression.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
2)
如果参数是任何其他类型T表达,然后
原文:
If the argument is any other expression of type T, then
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
a)
如果价值范畴expression xvalue,然后decltype指定T&&
原文:
if the 价值范畴 of expression is xvalue, then the decltype specifies T&&
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
b)
如果该值类的expression是“左值”,然后decltype指定T&
原文:
if the value category of expression is lvalue, then the decltype specifies T&
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
c)
否则,,decltype指定T
原文:
otherwise, decltype specifies T
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
需要注意的是,如果一个对象的名称parenthesised,它成为左值表达式,从而decltype(arg)decltype((arg))往往是不同的类型.
原文:
Note that if the name of an object is parenthesised, it becomes an lvalue expression, thus decltype(arg) and decltype((arg)) are often different types.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
decltype是有用的,当宣布是很难或不可能申报使用标准的符号,如λ-依赖于模板参数的类型或类型的类型.
原文:
decltype is useful when declaring types that are difficult or impossible to declare using standard notation, like lambda-related types or types that depend on template parameters.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 关键字

decltype

[编辑] 示例

#include <iostream>
 
struct A {
   double x;
};
const A* a = new A();
 
decltype( a->x ) x3;       // type of x3 is double (declared type)
decltype((a->x)) x4 = x3;  // type of x4 is const double& (lvalue expression)
 
template <class T, class U>
auto add(T t, U u) -> decltype(t + u); // return type depends on template parameters
 
int main() 
{
    int i = 33;
    decltype(i) j = i*2;
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
 
    auto f = [](int a, int b) -> int {
       return a*b;
    };
 
    decltype(f) f2{f}; // the type of a lambda function is unique and unnamed
    i = f(2, 2);
    j = f2(3, 3);
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
}

输出:

i = 33, j = 66
i = 4, j = 9

[编辑] 另请参阅

(C++11)
在未经评估的情况下获得了表达式的类型
原文:
obtains the type of expression in unevaluated context
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数模板) [edit]