首页 > 编程知识 正文

proverb的用法,cscope使用方法

时间:2023-05-06 07:11:40 阅读:30013 作者:3174

在c中,decltype作为操作符用于查询表达式的数据类型。 decltype是在制定C 11标准时引入的,主要为通用编程而设计,通用编程中存在由模板参数决定的类型,解决了表达困难或不可能的问题。 类属编程在整个20世纪90年代越来越流行,也产生了对实现类型推导机制的需求。 因此,许多编译器制造商都是基于程序语言的现有功能自行实现这种操作符的。 像typeof这样的实现,虽然功能有限,但是有容易移植的实现等。 2002年,kfdqj建议将此类操作符命名为“decltype”,以反映它具有检索建议在c中标准化并添加到c中的表达式的“声明类型”(Declared Type )的能力。 从意义上说,decltype的设计适合通用库创建者和编程初学者。 通常,对于目标对象或函数,decltype派生的类型与源代码中的定义完全匹配。 与sizeof操作符一样,decltype也不需要评估操作数。

与sizeof操作符一样,decltype也不需要评估操作数。 大致而言,如果在decltype(e )返回类型之前表达式e指向局部变量、命名空间范围变量、静态成员变量或函数参数,则导出返回类型为该变量(或参数)的声明类型。 如果e为lvalue,即“可寻址值”,则decltype(e )返回t。 其中,t是e的模子。 如果e是x值(xvalue ),则返回值为t; 如果e为“纯右侧”,则返回值为t。 这些语义旨在满足通用库创建者的需要,但decltype的返回类型始终与对象(或函数)的定义类型相匹配,因此对于编程初学者来说也很直观。 更正式地说,规则1适用于不带括号的标识符表达式(id-expression )和类成员访问表达式。 示例: const int foo (; 常数int bar (; int i; 结构a {双x; (; const A* a=new A (; 1个Ecl类型(foo ) ); //类型为constintDecltype(bar ) ) x2; //类型为intdecltype(I ) x3; //类型为4个intdecltype(a-x ); //类型为doubleDecltype () (a-x ) ) x5; 正如//类型为const double所示,对最后两个decltype的调用返回的结果不同。 这是因为带括号的表达式(a-x )既不是“标识符表达式”,也不是类访问表达式,而是指向左侧的值,因此派生类型为“引用表达式类型”,即const double 2008年12月,TLDBBT(jaakkojrvi )向标准委员会指出了问题。 在c中,“限定符”(qualified-id )不能由decltype创建,但这正是“decl type (e )”和“类型定义名称”) )。 在评论c0x(c11 )的正式草案时,日本ISO会员的成员表示:“一个定义域操作员(: )不适用于decltype,但应该适用。 如果可以解决此问题,则在需要从实例检索成员类型(嵌套类型)时很有用。 以下所示。 ) vectorint v; DCLtype(v ) :value_type i=0; //int i=0; 对于此问题和其他类似问题(decltype不能用于派生类声明和析构函数调用),该问题由无可争辩的葡萄柚处理,并于2010年3月安排在工作时间表中# include algorithm # include iostream # include iterator # include ostream # include string # include utility # includevectorusingnong struct plus { template typename t,typenameuautooperator((tt,u ) const-decl type (前锋) t ) fff ; int main () {vectorint i; I.push_back(1; I.push_back(2; I.push_back(3; vectorint j; j.push_back(40; j.push_back(50; j.push_back(60; vectorint k; 向量字符串; s.push_back(cut ); s.push_back(flu ); s.push_back(kit ); 向量字符串t; t.push_back(e ); t.push_back(ffy ); t.push_back('Tens ' ); 向量字符串u; 传输(j.begin (,i.end )、j.begin )、back_inserter(k )、Plus ); 传输(t.begin (,s.end )、t.begin )、back_inserter(u )、Plus ); for_each(k.begin ),k.end ),[ ] { cout n ' ]; ); cout endl; for_each(u.begin ),u.end ),[ ] { cout r ' ]; ); cout endl; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。