首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏C++

    深入解析decltypedecltype(auto)

    decltype在普通代码中应用并不广泛,主要用在泛型编程中较多,因此没有auto使用得多,下面将介绍decltype的推导规则,在介绍过程中遇到和auto规则不一样的地方则将两者对照说明,最后再介绍decltype 推导规则我将decltype的推导规则归纳为两条,根据expr有没有带小括号分为两种形式,如以下的形式:decltype(expr)// 或者decltype((expr))expr没有带括号的情形当expr a[10];// (4) decltype(a)为int[10]decltype(func);// (5) 结果为int(int, int)(1)式decltype(x1)的结果和x1的类型一致,为int decltype的使用场景上面提到decltype和auto的一个区别就是使用auto必须要有一个初始值,而decltype在定义变量时可以不需要初始值,这在定义变量时暂时无法给出初始值的情况下非常有用 decltype(auto)的使用解析自动推导表达式的结果的类型decltype(auto)的使用语法规则如下:decltype(auto) var = expr;它的意思是定义一个变量var,auto

    49720编辑于 2024-04-12
  • 来自专栏全栈程序员必看

    decltype函数_decltype有什么用

    因为decltype在很多的时候并不同于auto操作符, 所以我会将大部分的不同罗列出来, 比如 : 数组, 顶层const等. decltype decltype的声明 : decltype(exp( )) x; // exp()可以是任何的表达式 1. decltype与普通类型 先来看看怎么使用decltype操作符 int i = 0; decltype(i) di; // 需要传入一个表达式才行 , di并不必须要初始化 decltype(i + 0) j; decltype(function()) f; auto ai = i; // auto必须对其进行初始化 与auto不同, decltype , 所以 int a[] = { 1, 2}; decltype(*a) b = i; // decltype推导出来的是引用, 因为*a表达式的结果是一个左值 decltype(&a[0]) ptr; // decltype推导出的类型是 int ** 6. decltype与模板 在模板中, 编译器能自行推导出传入函数的参数类型, 但是无法推导出返回值的类型, 这时我们就可以用decltype

    1.8K20编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    decltype 使用

    功能 decltype可以将给定的表达式或变量的类型推导出来,包含引用和指针。 一般用于复杂表达式作为返回值的类型推导。 可以用于补足c++11的auto缺陷. 复杂表达式 案例一 int main() { decltype((1+2+3+4)) a = 1; return 0; } 结果是int类型. 所以这里编译报错. decltype的真正作用 组合后的返回值,复杂表达式。 说明 std::vector进行[],返回的一般都是&类型,但是bool则例外. ,decltype表示按照decltype的规则进行,即何在一起就是支持引用类型推导。 总结 decltype得到的是声明的类型. 复杂表达式得到的是最终结果的类型,即运算后结果的声明类型.

    51620编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    typeid与decltype

    decltype产生之前,很多编译器的厂商都开发了自己的C++语言扩展用于类型推导。C++11则将这些类型推导手段进行了细致的考量,最终标准化为auto已经decltype。 前者可以参考之前的博客,这里着重讲decltype,如下例: int main() { int i; decltype(i) j = 0; cout << typeid(i).name() << endl; float a; double b; decltype(a + b) c; cout << typeid(c).name() << endl; } 运行结果: int double 从上例可以看出,decltype的类型推导并不像auto一样是从变量声明的初始化表达式获得变量的类型,decltype总是以一个普通的表达式为参数,返回该表达式的类型。 而与auto相同的是,作为一个类型指示符,decltype可以将获得的类型来定义另外一个变量。与auto相同,decltype类型推导也是在编译时进行的。

    80850编辑于 2022-10-29
  • 来自专栏全栈程序员必看

    decltype用法_指针声明符

    关于decltype操作符的说明: 1、在C++中,decltype作为操作符,用于查询表达式的数据类型。 decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题。 2002年间,比雅尼·斯特劳斯特鲁普提议在C++内标准化这类操作符,并将之加入C++;且建议命之为“decltype”,以反映其具有获取表达式的“声明类型”(Declared Type)的功能。 2、从语义上说,decltype的设计适合于通用库编写者与编程新手。总体上说,对于目标对象或函数,由decltype推导出的类型与源码中的定义可精确匹配。 而正如sizeof操作符一样,decltype亦不需对操作数求值。

    32910编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    有auto为什么还要decltype ?详解decltype的用法

    decltype用法 auto和decltype推导类型的区别 decltype用法: 1.decltype变量 2. ==decltype表达式== 2.1 表达式做右值 2.2 表达式能做左值 3. decltype 函数 3.1 decltype(f()) 3.2 decltype(f) C++ 11 中decltype decltype用法: 1.decltype变量 形式:decltype(var) 和auto不同,decltype会保留const属性和引用属性,看下面的例子: const int ci = 0, & cj = ci; decltype(ci) x = 0;//x的类型为const int decltype(cj) y = x; //y的类型为const int& decltype(cj) z; / int ii = 42, *p = ⅈ decltype(*p) c;//错误,c是int&,必须初始化 decltype((ii)) d;//错误,d是int&,必须初始化 3. decltype

    1.2K10编辑于 2022-10-01
  • 来自专栏全栈程序员必看

    【C++深陷】之“decltype

    0. decltype关键字 decltype被称作类型说明符,它的作用是选择并返回操作数的数据类型。 关于decltype,需要注意: 工作原理 decltype + 变量 var decltype + 表达式 expr decltype + 函数名 func_name 1. 3. decltype + 表达式 ②当使用decltype(expr)的形式时,decltype会返回表达式结果对应的类型。 & decltype(*p) c = i; 这里注意一下decltype(*p)。 总结 decltype是为了解决复杂的类型声明而使用的关键字,称作decltype类型说明符。 decltype可以作用于变量、表达式及函数名。

    1.5K20编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    C++11 decltype 的用法

    文章目录 decltype 的意义 decltype 的用法 1. 推导规则 2. 举例说明 3. 模版案例 更多细节问题 C++14 取消 decltype 其他 decltype 的意义 ---- 参考博客:C++11新标准:decltype关键字 有时我们希望从表达式的类型推断出要定义的变量类型 decltype 的用法 ---- 1. = g; decltype(rg) rg1 = g; // 引用 const 变量 decltype(rg) rg2 = 1; // 引动常量 // decltype(rg) rg3; // err, // decltype(bar) i2; // err, 这个是错的,因为构成了重载 // 9-特别注意 int j = 0; decltype(false ?

    42340编辑于 2022-10-03
  • 来自专栏iDoitnow

    C++ decltype和返回类型后置

    1. decltype decltype的使用方式如下: decltype(expression) var; 关键字decltype的作用是将变量的类型声明为表达式指定的类型。 decltype(lx) n = y; //n的类型为double & decltype(pd) u; //u的类型为const double * 2):如果expression的条件不符合 例如: double xx = 1.0; decltype( (xx) ) rx = xx; //rx的类型是double & decltype(xx) m = xx; //m的类型是double,因为虽然 例如: int a = 1; int &b = a; int &c = a; decltype(a+1) a1; //a1的类型为int decltype(100L) aa;//aa的类型为long ,使用新增的语法可以写为: template<typename T, typename U> auto fun(T t, U u) -> decltype(t + u) //此时decltype在参数t

    1.3K50编辑于 2023-02-26
  • 来自专栏全栈程序员必看

    c++ decltype用法_c++ typedef struct

    C++ decltype flyfish 返回类型后置 编译器通过初始化去顶auto代表的类型,不需要定义变量仅希望得到类型使用decltype 使用方式1 类似auto std::vector<int > v; typedef decltype(v.begin()) it; for (it i = v.begin(); i ! = v.end(); i++) { } 使用方式2 i和j的类型相同 int i = 1; decltype(i) j = i * 2; 使用方式3 返回类型后置 template<typename T, typename U> auto add(T t, U u) -> decltype(t + u) { return t + u; } auto

    58910编辑于 2022-09-30
  • 来自专栏我的技术专栏

    C++11特性:decltype关键字

    而编译时类型推导,除了我们说过的auto关键字,还有本文的decltypedecltype与auto关键字一样,用于进行编译时类型推导,不过它与auto还是有一些区别的。 decltype用法 推导出表达式类型 int i = 4; decltype(i) a; //推导结果为int。a的类型为int。 ; } decltype推导四规则 如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么的decltype(e)就是e所命名的实体的类型。 否则 ,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&& 否则,假设e的类型是T,如果e是一个左值,那么decltype(e)为T&。 decltype(arr[5]) var9 = i;//int&. []操作返回左值 decltype(*ptr)var10 = i;//int& *操作返回左值 decltype

    55260编辑于 2022-05-06
  • 来自专栏Linux兵工厂

    auto、decltype关键字知识点笔记

    int x = 42; decltype(x) y; // y 的类型为 int std::vector<int> v = {1, 2, 3}; decltype(v)::value_type elem auto x = 42; decltype(x) y; // y 的类型为 int 区别和注意事项 auto 用于变量声明时的类型推导,而 decltype 用于获取表达式的类型。 auto 推导的类型是变量的初始值的类型,而 decltype 推导的类型是表达式的类型。 当表达式为引用类型时,auto 推导的类型会忽略引用,而 decltype 会保留引用。 auto x = 42; decltype(x) y; // y 的类型为 int 函数返回类型推导: decltype 可以用于推导函数返回类型,使得函数的返回类型可以根据表达式自动推导出来。 和 decltype 的使用场景: unsetunset5. auto 和 decltype 的结合使用unsetunset auto 和 decltype 可以结合使用,以便在一个表达式中使用 decltype

    31610编辑于 2024-03-18
  • 来自专栏编程珠玑

    decltype--从表达式推断类型

    试试auto吧》中介绍了自动类型推导,它需要有初始值,今天再来介绍一个C++11中的特性,decltype。 作用 从表达式类型推断要定义的变量类型 声明返回类型依赖形参类型的函数模板 不过decltype并不会对表达式进行求值。 用法 decltype根据表达式的类型来获取类型。 int a = 1024; decltype(a) b;//decltype(a),得到int,b为int类型 const char c = 'c'; decltype(c) d = 'd';//d是 还有双重括号的情况: int a = 10; decltype((a)) b = a;//b是int & 如果加了双重括号,它最终也会得到引用类型。 再比如你想给某个复杂类型取一个别名: vector<int> vec typedef decltype(vec.begin()) vecItType; 总结 decltype虽然对于不同场景下得到的类型不同

    1.2K10发布于 2019-11-23
  • 来自专栏全栈程序员必看

    c++中decltype_find的用法归纳

    1.什么是decltype decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。 auto varName=value; decltype(exp) varName=value; auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的 value没有关系 auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导 而decltype不要求,因此可以写成如下形式 decltype( 的几种形式 int x = 0; decltype(x) y = 1; // y -> int decltype(x + y) z = 0; // z -> int const int& i = x; decltype(i) j = y; // j -> const int & const decltype(z) * p = &z; // *p ->

    43940编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    decltype有什么用_剑本身用法的介绍

    想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype 语法是:delctype(表达式),其中表达式可以是变量、函数、数组等。 main() -> int { std::cout << "testing decltype..." << std::endl; /* 表达式是函数 */ decltype(onlyDeclartionFunc int & // c = ci; // error C3892: “c”: 不能给常量赋值 decltype(cj) d = 9; // const int & // decltype(cj) = " << j << std::endl; // 对数组使用decltype**得到的是数组类型 int arr[] = { 3,4,5}; // decltype(arr) crr = {5,6,7,8,9 = 3 type(drr) is: int [3] 对数组使用decltype得到的是数组类型,与auto不同 // 对数组使用decltype int arr[] = { 3,4,5}; // decltype

    43210编辑于 2022-09-30
  • 来自专栏magicsoar

    Effective Modern C++翻译(4)-条款3:了解decltype

    条款3 了解decltype decltype是一个有趣的东西,给它一个变量名或是一个表达式,decltype会告诉你这个变量名或是这个表达式的类型,通常,告诉你的结果和你预测的是一样的,但是偶尔的结果也会让你挠头思考 (decltype和auto?) 对一个变量名使用decltype产生声明这个变量时的类型,但是就像我说的,有名字的是左值表达式,但这没有影响decltype的行为,因为对于比变量名更复杂的左值表达式,decltype确保推导出的类型总是一个左值的引用 decltype( auto) f1() { int x = 0; … return x; // decltype(x) 是 int, 所以f1返回int } decltype(auto 但同时不要失去对大局的注意,decltype(无论是独立使用还是和auto一起使用)推导的结果可能偶尔让人惊讶,但是这并不会经常发生,通常,decltype的结果和你所期待的类型一样,尤其是当decltype

    1.1K90发布于 2018-02-06
  • 来自专栏C++11

    C++11 中 auto 和 decltype 的深入解析

    decltype 关键字基本概念decltype 是一个操作符,用于查询表达式的类型,而不实际计算表达式的值。它在编译时检查参数的类型,并生成该类型,是一个纯粹的编译时操作。 (将亡值),decltype 推导出的类型是 T&&;如果表达式的值类型是 lvalue(左值),decltype 推导出的类型是 T&;如果表达式的值类型是 prvalue(纯右值),decltype Lambda 表达式的类型,可以使用 decltype。 如果 exp 是函数调用,则 decltype(exp) 的类型就和函数返回值的类型相同(不会调用函数)。如果 exp 是一个用括号括起来的左值,则 decltype(exp) 为指向其类型的引用。 auto 和 decltype 的结合使用auto 和 decltype 可以结合使用,以便在需要类型匹配的场景中自动推导变量类型。

    31310编辑于 2025-06-04
  • 来自专栏小樱的经验随笔

    C++ 中 auto 与 decltype 的用法与区别

    decltype 关键字 而 decltype 类型说明符也是 C++11 的标准,它是用于从表达式的类型推断出要定义的变量的类型。 ; } int main(int argc, const char *argv[]) { decltype(func()) a; int i; decltype(i) b; std:: 注:decltype()括号中的表达式并不去执行,而 decltype((variable)) 的结果永远是引用,而 decltype((variable)) 只有当 variable 本身是一个引用是才是引用 auto 关键字和 decltype 关键字的区别 对于 decltype 所用的表达式来说,如果变量名加上一对括号,则得到的类型与不加上括号的时候可能不同。 如: int i; decltype(i) // int类型 decltype((i)) // int& 类型 在这里我们不探讨太多的一些具体的细节,只介绍一些常用的一些用法和注意事项,想了解更多的话参考

    2.5K10发布于 2019-05-07
  • 来自专栏全栈程序员必看

    C++中decltype与左值和右值「建议收藏」

    1 decltype关键字 decltype是C++11中引入的新的类型说明符。编译器根据分析表达式或者函数返回值来分析其类型。 decltype的详细用法,请参考《C++中decltype的使用方法》 2 decltype与左值和右值 decltype后面跟的表达式是左值或者右值时,编译器分析的类型会有所不同。 int arr[2] = { 10,20 }; decltype (arr[1])k = i; decltype (&arr[1])j = &i; 其中,arr是一个拥有2个元素的int数组,arr[1

    82510编辑于 2022-07-23
  • 来自专栏C++11

    《C++11》`decltype`详解、与`auto`比较及原理浅析

    本文将深入探讨decltype和auto的工作原理,并进行比较。decltype详解decltype是一个用于查询表达式类型的关键字。它在编译时检查参数的类型,并生成该类型。 decltype与auto的比较decltype和auto都可以用于类型推导,但它们在处理类型时有所不同。 decltype的工作原理decltype关键字的工作原理也基于C++的类型系统,但它的工作方式与auto有所不同。decltype会分析其参数的类型,然后生成该类型。 int x = 0;decltype(x) y = x; // y的类型是int在这个例子中,decltype(x)会查看x的类型,然后生成该类型。 例如,如果参数是一个未括起来的名称,decltype会生成该名称的类型;如果参数是一个括起来的表达式,decltype会生成该表达式的类型。

    32800编辑于 2025-01-02
领券