加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Qt – QList const正确性

发布时间:2020-12-16 03:23:23 所属栏目:百科 来源:网络整理
导读:QList T *不能轻易纠正.考虑这个功能 void f(QListT * list){ list[0]-constFunction();} 我可以改变f到 void f(QListconst T * list) 但后来我不能这样做 f(QListT *()); //Compile error 因为编译器不能隐含地转换QList T *到QList const T *.但是,我可以
QList< T *>不能轻易纠正.考虑这个功能
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的人都应该得到他们得到的任何东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读