voID f(QList<T *> List){ List[0]->constFunction();}
我可以改变f到
voID f(QList<const T *> List)
但后来我不能这样做
f(QList<T *>()); //Compile error
因为编译器不能隐含地转换QList< T *>到QList< const T *>.但是,我可以明确地重新解释QList,如下所示:
template <typename T> inline QList<const T *> &constList(const QList<T *> &List){ return (QList<const T *> &)List;}
这使我能够使用constList模板函数来转换任何QList< T *>进入QList< const T *>,如
f(constList(QList<T *>()));
它似乎工作正常,但实际上这样做是否安全?
解决方法 你正在考虑的铸造功能,……template< class T >inline QList<T const*>& constList( QList<T*> const& List ){ return reinterpret_cast< QList<T const*>& >( const_cast< QList<T*>& >( List ) );}
…可能是实用的(可能QList不会根据元素类型的常量改变其对象表示),但它可能会破坏const的正确性.
首先,因为抛弃列表本身的常量不是正确的:它允许您更改原始的const列表.
但即使删除了那个正式的参数const,就像……
template< class T >inline QList<T const*>& constList( QList<T*>& List ){ return reinterpret_cast< QList<T const*>& >( List );}
……仍有一个常设正确性问题.
原因是该列表构成了一个额外的间接层,并且您的函数本身并不是const.因此,在使用函数获取对具有所谓的指向const元素的列表的引用之后,您可以在该列表中存储指向真正const的内容的指针.然后你可以使用原始列表来修改那个真正的const项目,爆炸.
这与no implicit conversion from T**
to T const**
的原因相同.
没有这些问题你可以做的是,使用已经是指向对象的指针列表,使那些指向对象const:
template< class T >inline QList<T const*> const& constList( QList<T*> const& List ){ return reinterpret_cast< QList<T const*> const& >( List );}
在形式上仍然存在reinterpret_cast作为一个潜在的问题,但任何专门针对元素常量表示QList的人都应该得到他们得到的任何东西. 总结
以上是内存溢出为你收集整理的c – Qt – QList const正确性全部内容,希望文章能够帮你解决c – Qt – QList const正确性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)