18

次のコードがコンパイルできない理由がわかりません

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

    return 0;
}

コンパイラは次のようにエラーを出します:

エラー:タイプ'float*'の式からのタイプ'const float *&'の参照の初期化が無効です

しかし、fooで参照せずに渡そうとすると、正常にコンパイルされます。

参照で渡すかどうかに関係なく、同じ動作を示すはずだと思います。

ありがとう、

4

1 に答える 1

27

型安全ではないからです。検討:

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;
}
于 2012-07-17T01:03:57.913 に答える