• 6177阅读
  • 3回复

[提问]关于模板、常引用和常指针的问题【已解决】 [复制链接]

上一主题 下一主题
离线luoyes
 

只看楼主 正序阅读 楼主  发表于: 2011-09-26
QList::contains函数原型为:
QBool contains(const T &t) const;


假设T为QWidget*
contains的参数则被衍化为: QWidget * const & t


这样一来传入的参数的类型就不能为 const QWidget * const。


为什么不是衍化为 const QWidget * const & t 呢?


常引用的含义应该与带两个const的指针是一样的,即指向的是常对象,不可指向其他目标。不解啊。


这个问题使得我在希望写一个常成员函数时,又需要用到向类似于contains这样的函数传递this指针时不得不放弃使用常成员函数(或者使用const_cast)。
小弟愚蠢,百思不得其解,还请大侠来帮帮忙,谢谢了!


离线luoyes

只看该作者 3楼 发表于: 2011-09-30
哦,确实,这个“衍化”一词说的过于含糊

const T &t 等价写法就是 T const &t

对啊!
这么简单啊,呵呵

但是模板类这么写用起来确实有时候不太方便,本来应该写成常成员函数的不得不使用const_cast或不使用常成员函数。

稍等,其实在定义链表时这样就可以了:

  1. QList<const QWidget *> m_lst;


这样在常函数中调用
  1. m_lst.append( this );


就没问题了,但是这样一来链表里的指针就只能用来调用常函数。
看来const的使用还是没用到家啊。
离线dbzhang800

只看该作者 2楼 发表于: 2011-09-30
引用第1楼luoyes于2011-09-30 13:53发表的  :
没人回答,也许问了不该问的问题吧

这个,主要是看不太懂你的问题吧:

QList::contains函数原型为:
QBool contains(const T &t) const;

假设T为QWidget*
contains的参数则被衍化为: QWidget * const & t

这个不存在衍化问题
const T &t 等价写法就是 T const &t

当和模板打交道或者与typedef打交道时,后一种写法更容易使用,(因为直接可以替换里面的 别名)。

对于你的例子:就是
QWidget * const & t

离线luoyes

只看该作者 1楼 发表于: 2011-09-30
没人回答,也许问了不该问的问题吧
快速回复
限100 字节
 
上一个 下一个