gpt4 book ai didi

c++ - Const 正确性导致指针容器出现问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:08 25 4
gpt4 key购买 nike

给出这段代码(使用了 C++,Qt 容器,但我想这个问题是普遍的):

// a containter for Item-s
QList<Item*> items;

// argument is const to prevent changing the item by this function
void doStuff(const Item *item)
{
// find index of the item inside the container
// indexOf() is declared as:
// template <typename T> int QList<T>::indexOf(const T &t, int from = 0) const
const int itemIndex = items->indexOf(item);
}

我得到一个编译错误(MSVC2010):

error C2664: 'QList::indexOf' : cannot convert parameter 1 from 'const Item *' to 'Item *const &'
with
[
T=Item *
]
Conversion loses qualifiers

我认为由于 indexOf() 是用 const T & 参数声明的,所以该参数将变成 const Item* & (指向指向 const 项的指针的引用),这很容易从 const Item* 参数中获得。不幸的是,自const T& t and T const &t are equivalent ,出于某种原因,编译器似乎将参数视为 Item* const &t ,它读作“对指向项目的 const 指针的引用”,这是不同的东西并且不会使 Item 指向不可变。

我的解释正确吗?为什么编译器会把事情搞砸,即使函数的声明方式表明它不会改变参数?这真的是 const 语法等价如何搞砸事情的例子吗?为什么编译器使用后一种形式而不是前一种形式?如果我想在容器中存储指针并保持严格的 const 语义,我该怎么办?

最佳答案

在这种情况下,您可以使用 const_cast 删除 const-ness 而不会违反您的功能保证。

// argument is const to prevent changing the item by this function
void doStuff(const Item *item)
{
// find index of the item inside the container
// indexOf() is declared as:
// template <typename T> int QList<T>::indexOf(const T &t, int from = 0) const
const int itemIndex = items->indexOf(const_cast<Item*>(item));
}

那是因为 indexOf 只是在容器中找到指针,而不是取消引用指针并改变另一边的内容。

关于c++ - Const 正确性导致指针容器出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com