2
int main()
{
    const int* x;
    int* pa = x;//removes const, so UB.

    const int*& pb = pa;//error
    int* pd = pb;//error
    return 0;
}

pointer to non-const dataaを aで定義することはできないことを知っていますpointer to const data。これは、定数を自動的にキャンセルして値を変更できるようにするためです。
しかし、2 番目の初期化の何が問題なのですか? 参照が何かのエイリアスであり、それがどのように機能するかは知っていますが、そこで実際に何が起こっているのかはまだわかりません。2 番目のエラーの説明は、うまくいけば、3 番目のエラーを教えてくれると思います。
誰でも光を当てることができますか?ありがとう!

4

2 に答える 2

7
const int x = 1;
int* p;
const int*& r = p;

ここまで進んだと想像してください。この最後の行は、質問しているエラーを示しますが、それが機能すると仮定しましょう。ここで、同じポインター オブジェクトrを参照します。pしかし今、これを行うことができます:

r = &x;

これは問題ないと思うかもしれませんが、 objectをr指摘しますが、それも指摘します。は(ではない) であるため、 を使用して変更できます。constxppint*constpx

*p = 2;

constオブジェクトの値を変更しました。問題のエラーにより、これを行うことができなくなります。

したがって、基本的に、このエラーの理由は、ポインターへの参照をconst非ポインターへのポインターにバインドできると、オブジェクトを指すconst非ポインターを取得する方法が得られるからです。良くないね。constconst

C++ の変換でエラーが発生するのはなぜですかFoo**Foo const**FAQ を参照して、参照ではなくポインターを使用した同じ問題について学習してください。理屈は同じです。

于 2013-05-03T23:03:04.757 に答える
0

これは、一時を非 const 参照にバインドできないというルールの別のインスタンスです。

例えば

X f();

X& r = f(); // illegal
X const& cr = f(); // OK

intポインターをポインターに変換できますconst intが、その変換の結果は異なる型の新しいポインターになります。右辺値 (この変換の結果など) を非 const 参照にバインドすることはできません。たとえば、const 参照にのみバインドできます。

const int* const& pb = pa; // pb is not bound directly to pa but to
                           // the result of converting pa to const int*
于 2013-05-04T00:38:21.623 に答える