我写了这样的话:
#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)
突然之间,问题就消失了。
为什么???有什么区别?
答案 0 :(得分:8)
const
如何运作?它始终适用于它之前的内容。但是,如果以前什么也没有,它适用于它之后的内容。换句话说,const Type&
与Type const&
相同。
现在,不要使用预处理器宏来定义类型别名。在C ++中有两种方法:using
和typedef
。您使用宏的事实是您观察这种奇特行为的原因。无法编译的代码扩展为以下内容:
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 type
和type const
之外,它们是相同的:
int const * p; // pointer to const int
const int * p; // ditto
所以如果父母是例如struct Parent{}
,然后Parent const & p
和const Parent & p
应该相同;但是,如果Parent
是一个宏,例如C*
,它们不同。