通过引用传递const指针

时间:2012-07-17 00:57:48

标签: c++ reference const implicit-conversion pointer-conversion

我很困惑,为什么以下代码无法编译

int foo(const float* &a) {
    return 0;
}
int main() {
    float* a;
    foo(a);

    return 0;
}

编译器给出错误:

  
    

错误:'const float *&'类型引用的初始化无效来自'float *'类型的表达式

  

但是当我尝试在foo中没有引用时传递,它编译正常。

我认为无论我是否通过引用都应该表现出同样的行为。

谢谢,

1 个答案:

答案 0 :(得分:20)

因为它不是类型安全的。考虑:

const float f = 2.0;
int foo(const float* &a) {
    a = &f;
    return 0;
}
int main() {
    float* a;
    foo(a);
    *a = 7.0;

    return 0;
}

任何非const引用或指针必须在指向类型中不变,因为非const指针或引用支持读取(协变操作)并且还写作(逆变操作)。

必须首先从最大的间接级别添加

const。这可行:

int foo(float* const &a) {
    return 0;
}
int main() {
    float* a;
    foo(a);

    return 0;
}