假设我有一个对指针进行const引用的函数......
示例:
void Foo( const Bar *&p_Thing, );
我传了一个指针
Bar *blah = NULL; // Initialized when program starts up
到函数
Foo( blah );
我可能会遇到像这样的编译器错误
invalid initialization of reference of type 'const Bar*&' from expression of type 'Bar*'
这种情况在我身上发生过几次,我真的想清楚一下const在应用参数传递方面的运作方式。感谢任何帮助。谢谢。
答案 0 :(得分:2)
这就是你想要的:
void Foo( Bar * const &p_Thing );
然后它成为Bar *
指针的const引用,它具有编译的可爱特性。
答案 1 :(得分:0)
我假设您想要一个对Bar *的const引用,而不是对const Bar *的引用?如果是,您想将其定义为void Foo(Bar * const& p)
答案 2 :(得分:0)
我永远无法想象引用指针和指针引用之间的语法差异。所以我消除歧义:
typedef const Bar *PBar;
void Foo(const PBar &p_Thing);
这样你也可以摆脱“const指针”/“指向const”的歧义。
答案 3 :(得分:0)
在这种特殊情况下的响应很简单:操作期望引用指向const内存的指针,但是你向它传递一个指向非const内存的指针。把它变成一个常数吧*会允许它。
但是,如果你遇到指针和常量问题,你应该考虑这个传递方案。通过引用传递指针并不罕见,但对于90%的任务,它并不是必需的。您可以传递指针或引用,或者将其作为函数或方法调用的值返回。在内存管理和代码易读性方面,这将更容易。
答案 4 :(得分:0)
您的功能需要指针 常量数据。
您正在传递指向可变或非常量数据的指针。有些编译器可能会抱怨目标数据的const
。
答案 5 :(得分:0)
虽然大多数问题确实回答了这个问题(你不能通过引用将变异指针传递给一个通过引用获取非变异指针的函数),但我不认为这个理由在任何答案中都是明确的:< / p>
它会打破常规正确性。如果通过引用传递非变异指针到通过引用获取常量指针的函数,它可以很好地修改指针以引用常量对象(毕竟,该类型保证它不会修改该值)。现在的问题是,在函数之外传入的指针实际上不是const,并且编译器必须允许对指向对象进行任何变异操作,这意味着修改最初为常量的对象。
这是一个简短的例子:
const int y = 0;
void f( const int *& p ) {
p = &y; // ok, p is a pointer to a constant integer
}
int main()
{
int *p;
f( p ); // if this was allowed p would point to y, but y is constant
*p = 5; // correct, p is a mutating pointer
}