[300分]关于从T&到T的模板实参推演问题的讨论

飞天御剑流 2013-12-26 09:19:33
加精
问题来自于新的auto关键字不能取得"引用"的类型啊,为什么? 这个帖子,主题意思是从T&到T的实参推演结果是T的原因是什么,包括偶在内有多人提出了自己的看法,虽然楼主也给了分,但实际上没有一个帖子道出了真正的原因。老实说偶一直没有注意到这个问题,通常的模板基础书籍例如C++ template等也没谈到,偶在C++11中翻了半天也没找到具体的条款,在C++98/03中测试了一下,发现从98/03起就是这样推导的了,并不是11的专利,为了问题描述方便,偶提供了98/03下的代码:


template< typename T >
struct is_reference
{
enum { value = 0 };
}

template< typename T >
struct is_reference< T& >
{
enum { value = 1 };
}

template< typename T >
void fun( T t )
{
std::cout << is_reference< T >::value;
}

int main( void )
{
int i, &a = i;
fun( a );
return 0;
}


大家可以看到,虽然实参是int&,但从fun中推导出的T是int,不是int&,但如果是int*,则推导出来的就是int*,请大家都谈一下自己的看法,谢谢!
...全文
1555 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2014-01-07
  • 打赏
  • 举报
回复
C++越来越复杂了。
zhangjian00199 2014-01-07
  • 打赏
  • 举报
回复
谢谢楼主分享
正义飞 2014-01-03
  • 打赏
  • 举报
回复
谢谢楼主分享
Todd_Pointer 2014-01-01
  • 打赏
  • 举报
回复
引用 42 楼 lm_whales 的回复:
[quote=引用 38 楼 supermegaboy 的回复:] [quote=引用 9 楼 lm_whales 的回复:] 指针,是一种实实在在的类型,引用不是。 1)编译器除了在语法上,语义上,把引用看作一种类型外; 其他时候,把他看作和被引用类型,是同一种类型。 2)C++,甚至没有运算符,来获取一个对象的引用,而是直接用对象,初始化引用。 3)引用不可以定义数组。 4)fun(T & a ); 和 fun (T a);构成命名冲突,而不是函数重载。 上面的种种都表示,C++引用不同于指针,不是一个独立的类型。 至于标准,各位列出的应该就是了,可能还有再找找吧!
还需要翻翻C++的类型系统,修正一下诸如“引用不是类型”这种观念,函数重载解析关于匹配的原则也得看下。[/quote] 谢谢。[/quote] 虽然说引用不是类型不够准确,但引用类型确实有其特殊性。 最大的特点就是你不能改变引用,只能改变被引用的对象。也就是说除了声明时(包括初始化、传参),其表现与非引用没有区别。typeid(foo) 与 typeid(foo&)也是一样的(老实说我没读过标准,不知道这个是偶然还是标准)。至少我认为跟新手强调下引用与指针、数组有本质区别是有必要的,我本人也确实是这么理解的 -- 引用不是类型(运行时类型,不是语法中的类型标识(比如BNF表示))。
szlovedd 2014-01-01
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
漫步者、 2013-12-31
  • 打赏
  • 举报
回复
ftjavayp 2013-12-31
  • 打赏
  • 举报
回复
zhuyf87 2013-12-31
  • 打赏
  • 举报
回复
30楼总结的好,膜拜。
diaoke90 2013-12-30
  • 打赏
  • 举报
回复
这个帖子才是高端帖子,我是来学习的。C++11还没有正式接触
铅小笔1 2013-12-30
  • 打赏
  • 举报
回复
这么牛B,这里的人才真是多..我介绍个人才交流的平台给大家吧.. http://fk.oeeee.com/szlg/
zhouxiaolong404 2013-12-30
  • 打赏
  • 举报
回复
其实多看看书是很必要的
正义飞 2013-12-30
  • 打赏
  • 举报
回复
看看是什么~
陌上花开哦 2013-12-30
  • 打赏
  • 举报
回复
能不能别踹我,我仅需积分,有急用,谢谢
Jeson_杰森 2013-12-29
  • 打赏
  • 举报
回复
虽然现在看起来吃力,C语言以后会接触
马金库 2013-12-29
  • 打赏
  • 举报
回复
看看是什么~
飞天御剑流 2013-12-28
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
实参真的是引用类型吗? 定义引用类型的变量只是指明了一个别名,使用引用的变量的时候应该和直接使用它引用的东西本质上是一样的,已经没有是否是引用的区别了。
道理上说得通,但还需要精确一点。
飞天御剑流 2013-12-28
  • 打赏
  • 举报
回复
引用 2 楼 mougaidong 的回复:
#include <iostream>

template< typename T > 
struct is_reference {
  enum { value = 0 };
};

template< typename T > 
struct is_reference< T& > { 
  enum { value = 1 };
};

int main(int argc, char* argv[]) {
  int i, &a = i;
  std::cout << is_reference< decltype(a) >::value << std::endl;                                                                                                                                                                                                               
}
解决是简单的,原因才是吸引人的地方。
飞天御剑流 2013-12-28
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
apparently, you missed this important point in the standard. c++11 5/5 If an expression initially has the type “reference to T” (8.3.2, 8.5.3), the type is adjusted to T prior to any further analysis.
我靠,原来藏到表达式的条款中去了,怪不得翻遍了template deduce都找不到。
碼上道 2013-12-28
  • 打赏
  • 举报
回复
学习了,感谢大家的讨论啊
lm_whales 2013-12-28
  • 打赏
  • 举报
回复
引用 38 楼 supermegaboy 的回复:
[quote=引用 9 楼 lm_whales 的回复:] 指针,是一种实实在在的类型,引用不是。 1)编译器除了在语法上,语义上,把引用看作一种类型外; 其他时候,把他看作和被引用类型,是同一种类型。 2)C++,甚至没有运算符,来获取一个对象的引用,而是直接用对象,初始化引用。 3)引用不可以定义数组。 4)fun(T & a ); 和 fun (T a);构成命名冲突,而不是函数重载。 上面的种种都表示,C++引用不同于指针,不是一个独立的类型。 至于标准,各位列出的应该就是了,可能还有再找找吧!
还需要翻翻C++的类型系统,修正一下诸如“引用不是类型”这种观念,函数重载解析关于匹配的原则也得看下。[/quote] 谢谢。
加载更多回复(35)

64,266

社区成员

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

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