通过引用传递const指针

rav*_*avi 14 c++ const reference implicit-conversion pointer-conversion

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器给出错误:

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

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

我认为它应该表现出相同的行为,无论我是否通过引用.

谢谢,

Ben*_*igt 24

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

const必须首先从最大的间接级别添加.这可行:

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我只想强调:"必须从最大的间接级别_first_添加",因为当在更高级别添加`const`时,它也允许在较低级别:`int foo(float const*const&a)`. (4认同)