当前位置:网站首页>模板于泛型编程之declval
模板于泛型编程之declval
2022-07-06 10:05:00 【发如雪-ty】
std::declval是c++11标准中出现的一个函数模板,这个函数模板长得比较奇怪,因为它没有函数体(没有实现,只有声明,故意这样设计的),所以无法被调用,一般都是用于的decltype,sizeof等关键字配合使用进行类类型推导、占用内存空间计算等。它的源码如下:
template<typename T>
add_ravalue_reference_t<T> declval() noexcept;
add_ravalue_reference(注意末尾没有_t,add_ravalue_reference_t是该类型对应的别名模板)是c++标准库中提供的一个类模板,他的功能是传入一个类型,返回该类型的右值引用类型。如:
(1)传入int类型,返回的是int &&类型;
(2)传入int &类型,则返回的还是int &,此处运用了引用折叠规则。
(3)传入int &&类型,返回的还是int &&类型,这里也运用了引用折叠规则。
从源码中可以看出declval的功能就是返回某个类型T的右值引用,不管该类型是否有默认构造函数,还是该类型是否可以创建对象。这些动作都是在编译时完成的,所以也称std::declval为编译时工具。
class cTest
{
public:
cTest(int a)
{
cout << "构造函数\n";
}
double myfunc()
{
cout << "myfunc\n";
return 1.1;
}
};
问题:如何得到myfunc()这个成员函数的返回类型double?传统的做法如下:
int main()
{
cTest myobj(1);
cout << typeid(decltype(myobj.myfunc())).name() << endl;
system("pause");
return 0;
}
结果:
从结果可以看出,为了获取myfunc的返回类型,必须要创建一个类cTest的对象;那么,可以进行深入一点的思考,创建类myobj很麻烦,还要提供实参,如果不创建类的对象,还想得到myfunc()成员函数的返回类型,这个想法能实现吗?当然可以~
int main()
{
cout << typeid(decltype(declval<cTest>().myfunc())).name() << endl;
system("pause");
return 0;
}
结果:
从结果来看,既没有创建类的对象,也没有调用myfunc成员函数,却实实在在地得到了myfunc的返回类型。
declval作用总结:
(1)从类型转换的角度来说,将任意一个类型转换成右值引用类型。
(2)从假想创建出某类型对象的角度来说,配合decltype,令decltype表达式中不必经过该类型(一般指一个类类型)的构造函数,就能使用该类的成员函数。
注意,std::declval不能被调用,也不能创建任何对象。但是std::declval能够在不创建对象的情况下,达到创建了一个该类型对象的效果。
边栏推荐
- Interview shock 62: what are the precautions for group by?
- Open source and safe "song of ice and fire"
- The shell generates JSON arrays and inserts them into the database
- After entering Alibaba for the interview and returning with a salary of 35K, I summarized an interview question of Alibaba test engineer
- The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement
- VR全景婚礼,帮助新人记录浪漫且美好的场景
- [introduction to MySQL] the first sentence · first time in the "database" Mainland
- Scratch epidemic isolation and nucleic acid detection Analog Electronics Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
- Pytest learning ----- detailed explanation of the request for interface automation test
- Unity tips - draw aiming Center
猜你喜欢
Summary of Android interview questions of Dachang in 2022 (I) (including answers)
C语言通过指针交换两个数
Easy introduction to SQL (1): addition, deletion, modification and simple query
重磅!蚂蚁开源可信隐私计算框架“隐语”,主流技术灵活组装、开发者友好分层设计...
开源与安全的“冰与火之歌”
sql语句优化,order by desc速度优化
面试突击62:group by 有哪些注意事项?
Today in history: the mother of Google was born; Two Turing Award pioneers born on the same day
Pytest learning ----- pytest operation mode and pre post packaging of interface automation testing
分布式不来点网关都说不过去
随机推荐
Alertmanager sends the alarm email and specifies it as the Alibaba mailbox of the company
78 岁华科教授逐梦 40 载,国产数据库达梦冲刺 IPO
How to solve the error "press any to exit" when deploying multiple easycvr on one server?
Pytorch extract middle layer features?
Unity tips - draw aiming Center
Binary search strategy
node の SQLite
The easycvr authorization expiration page cannot be logged in. How to solve it?
Four processes of program operation
How to submit data through post
Jielizhi obtains the currently used dial information [chapter]
SQL statement optimization, order by desc speed optimization
基本磁盘与动态磁盘 RAID磁盘冗余阵列区分
中移动、蚂蚁、顺丰、兴盛优选技术专家,带你了解架构稳定性保障
Cool Lehman has a variety of AI digital human images to create a vr virtual exhibition hall with a sense of technology
I want to say more about this communication failure
Unity粒子特效系列-闪星星的宝箱
declval(指导函数返回值范例)
Jerry's watch reads the file through the file name [chapter]
MSF horizontal MSF port forwarding + routing table +socks5+proxychains