为什么我不能在const参数函数/方法中传递const对象?

时间:2011-01-19 02:27:59

标签: c++ const

修改

很抱歉,我正在尝试了解使用QList::indexOf方法的代码示例,该代码在here中声明。

实际上我想弄清楚为什么我需要在这个特定情况下使用const_cast

int ProjTreeItem::row() const
{
    if (parentItem) {
            // instance of const object to test  
        const ProjTreeItem *item = new ProjTreeItem(QList<QVariant>(), NULL); 
            // Called indexOf here to test
        parentItem->childItems.indexOf(item); 
            // This works fine
        return parentItem->childItems.indexOf(const_cast<ProjTreeItem*>(this)); 
    }
    return 0;
}

EDIT2:

我正在寻找错误的地方,然后我开始怀疑这个问题与使用模板和const修饰符有关。我找到了这个帖子here。请看Jon的回答,我想这一点澄清了我的意见。对不起我的问题误导。

4 个答案:

答案 0 :(得分:3)

我想你想要这个:

void SomeClass::f(const MyClass*) const
{ ... }

答案 1 :(得分:2)

嗯,这段代码对我有用:

class MyClass
{
};

class SomeClass 
{
public:
    void f(const MyClass *t) const
    {
    }
};

int main()
{
    SomeClass s;

    const MyClass *myClass = new MyClass;
    MyClass *myClass2 = new MyClass;

    s.f(myClass);
    s.f(myClass2);

    return 0;
}

答案 2 :(得分:1)

您错误地假设item的类型等于this的类型,我相信这让您感到困惑。

const函数中,this的类型为ProjTreeItem const * const item。但是你的指针是const ProjTreeItem * item

// `this` is a constant-pointer-to-a-constant-ProjTreeItem
ProjTreeItem const * const this;   // obviously not valid code, just illustrating type

// `item` is simply a pointer-to-a-constant-ProjTreeItem
const ProjTreeItem * item;

从右到左阅读声明是有帮助的。

所以,声明你这样的项目指针,我怀疑你也需要一个演员。

const ProjTreeItem * const item = new ProjTreeItem(QList<QVariant>(), NULL);

答案 3 :(得分:0)

我认为你的意思是

parentItem->childItems.indexOf(item);

无法编译。 我还假设你写了

QList< ProjTreeItem* > childItems;

parentItem的类型(类)定义中 如果我理解正确,在行

parentItem->childItems.indexOf(item)

您要将ProjTreeItem const*转换为ProjTreeItem*,并且 这需要const_cast JaredC已经对constness表示友善。 我建议再仔细阅读他的答案。

修改
我认为乔恩的回答适用于你的问题 QList::indexOf的第一个参数是T const&,其中T是ProjTreeItem* 在你的情况下。
因此,具体参数类型为ProjTreeItem*const& 请注意,它与ProjTreeItem const*const&不同 ProjTreeItem*ProjTreeItem const*是不同的类型 从后者转换为前者需要const_cast ProjTreeItem const*表示ProjTreeItemconst 但是,ProjTreeItem*const&表示指针constProjTreeItem const

<强> EDIT2
你似乎误解了。

#include <typeinfo>
#include <iostream>
using namespace std;

struct ProjTreeItem;

template< class T >
struct Test {
  typedef T const type;
};

int main()
{
  cout<< boolalpha;
  cout<<
    (typeid( Test< ProjTreeItem* >::type ) == typeid( ProjTreeItem const* ))
  <<endl;
  cout<<
    (typeid( Test< ProjTreeItem* >::type ) == typeid( ProjTreeItem*const ))
  <<endl;
}

如果您的解释是正确的,上面的代码将打印true, 然后false
但是,代码会打印false,然后打印true