这个18行代码的程序看不懂

forget0915 2018-09-14 02:51:27

#include <iostream> // std::cout
template<class T, class U>
class ConversionTo
{
typedef char Type1[1];
typedef char Type2[2];
static Type1& Test( U );
static Type2& Test(...);
static T MakeT();
public://1.为何仅声明未定义的函数名可以扔sizeof里去求大小2.为何sizeof可以对函数名求值?
enum { ret = sizeof(Test(MakeT()))==sizeof(Type1) };
};
int main()
{ //3.为什么这个类可以判断T类型是否可被转成U类型?
std::cout << ConversionTo<int, double>::ret << '\n';
std::cout << ConversionTo<float, int*>::ret << '\n';
std::cout << ConversionTo<const int&, int&>::ret << '\n';
std::cin.get(); return 0;
}
...全文
140 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbasm 2018-09-14
  • 打赏
  • 举报
回复
你需要了解什么是 SFINAE
@风轻云淡_ 2018-09-14
  • 打赏
  • 举报
回复
我的理解是 函数名即函数地址,就像数组名即属组首地址一样,两个类型是否可以互转,只要占用空间一样,理论上来说就是可以互转的。一般来说,函数是在栈上的,难道是根据返回类型确定函数占用空间的大小,是不是我就不知道了,哈哈。
www_adintr_com 2018-09-14
  • 打赏
  • 举报
回复
1. sizeof 只需要推演出函数的返回值类型就行了, 不会调用函数, 所以不需要把函数定义出来. 2. 这里并没有对函数名求值, 当然 sizeof 是可以在函数名上使用的, 得到的是函数指针类型的大小. 3. 如果 T 可以转换成 U, 那么 Test(MakeT()) 会匹配 Type1& Test( U ); 这个重载, 否则的话会匹配 Type2& Test(...); 然后对应的返回值类型不同, sizeof 结果就不相同, ret 就会得到不同的值.

64,686

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧