const关键字是在Type之前还是之后?

时间:2016-10-24 13:27:07

标签: c++

我写了这样的话:

#define Parent C*
class C{
public:
    Parent parent;
    C():parent(NULL){}
};
void fun(Parent &p){
    //condition..return;
    fun(p->parent);
}

当我试图使引用参数保持不变以避免对引用对象进行任何意外更改时,发生了某些连线。

第一

我添加了const befor Parent,如下所示:void fun(const Parent &p)。但是它不能在这一行fun(p->parent);上编译。 错误信息是:

  

无效的参数'候选人是:void fun(const C *&)'

,然后

我改变了const这样的位置:void fun(Parent const &p)突然之间,问题就消失了。 为什么???有什么区别?

2 个答案:

答案 0 :(得分:8)

const如何运作?它始终适用于它之前的内容。但是,如果以前什么也没有,它适用于它之后的内容。换句话说,const Type&Type const&相同。

现在,不要使用预处理器宏来定义类型别名。在C ++中有两种方法:usingtypedef。您使用宏的事实是您观察这种奇特行为的原因。无法编译的代码扩展为以下内容:

void fun(const C*& p); // The pointee is const, but the pointer itself is not

我想你正在对p指向的对象做事......但是这个对象是const!在第二个示例中,扩展结果为:

void fun(C* const& p); // The pointee is not const, but the pointer itself is

然后,你在指针上做了一些东西,但这次它是指针,而不是指针,即const,所以一切都很好。如果您使用了别名或typedef,那么在两种情况下都会完全正常:请参阅this example

根据经验,您应该始终将const放在要应用它的东西的右侧。这将允许您按照它们的读取方式读取类型:从右到左。

答案 1 :(得分:5)

const从右到左工作,使前一部分为const,

int * const p; // makes constant pointer to int

除了const typetype const之外,它们是相同的:

int const * p; // pointer to const int
const int * p; // ditto

所以如果父母是例如struct Parent{},然后Parent const & pconst Parent & p应该相同;但是,如果Parent是一个宏,例如C*,它们不同。