C++ 将参数传递给常量参数时出现问题

C++ 将参数传递给常量参数时出现问题,c++,constants,C++,Constants,假设我有一个函数,它对指针进行常量引用 例如: 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 'Ba

假设我有一个函数,它对指针进行常量引用

例如:

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是如何操作的,它是如何应用于与参数传递相关的参数的。非常感谢您的帮助。

我想您想要的是一个常数条*,而不是常数条*?如果是,您想将其定义为void Foo(Bar*const&p)

我永远无法理解指向引用的指针和指向指针的引用之间的语法差异。因此,我消除了歧义:

typedef const Bar *PBar;
void Foo(const PBar &p_Thing);
这样,您还可以消除“const-pointer”/“pointer-to-const”歧义。

这就是您想要的:

void Foo( Bar * const &p_Thing );

然后它变成了对
条*
指针的常量引用,该指针具有可爱的编译功能。

在这种特殊情况下,响应很简单:操作期望引用指向常量内存的指针,但您将指针传递给非常量内存。把布拉变成一个常数条*会允许的


但是,如果你在指针和稳定性方面遇到问题,你应该考虑这个通过方案。通过引用传递指针并不少见,但对于90%的任务来说,这并不是真正必要的。您可以传递指针或引用,或者将其作为函数或方法调用的值返回。这在内存管理和代码易读性方面也会更容易。

您的函数需要指向常量数据的指针


您正在传递指向可变的或非常量数据的指针。一些编译器可能会抱怨目标数据的常量。

虽然大多数问题都能回答这个问题(不能通过引用将变异指针传递到通过引用获取非变异指针的函数中),但我认为在任何回答中都没有明确的理据:

它会破坏常量的正确性。如果您通过引用将一个非变异指针传递给一个通过引用获取常量指针的函数,那么它很可能会修改指针以引用常量对象(毕竟,该类型保证它不会修改该值)。现在的问题是,在函数之外,传入的指针实际上不是常量,编译器必须允许对指向的对象进行任何变异操作,这意味着修改一个最初是常量的对象

下面是一个简短的例子:

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
}

你把引用的常量、指针和指针指向的东西混在一起了。难道“const ref to pointer”的整个想法没有用吗?为什么不传递指针的常量副本呢?它实际上是指向常量内存指针的引用,因此参数是有意义的。
Foo
函数需要指向常量数据指针的引用。这允许函数修改指针。@Diego&@Thomas,如果我正确阅读了第一行:假设我有一个函数,它对指针进行常量引用……谢谢。这和Matthew的评论帮助我理解了问题和解决方法。