ポインティングされた配列要素と配列要素の定数がそれぞれ異なるポインターと配列への奇妙なセマンティクスwrtバインディング参照があります。ポインタで、これは予想通り失敗:タイプT [N]のオブジェクトにT(&ref)[N]をバインドします。
int* p{};
const int*& p_ref{p};
non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *'
は&
は、コンパイラを許可する前const
を追加する、と-int型ポインタとポインタツーのconst int型は、2つの異なる種類があり、理にかなっ一時的な作品を制作するには効果がありますが、上記は変わりません。
しかし、私は配列に類似であるべきと思ったものを
int arr[5]{};
const int (&arr_ref)[5]{arr};
打ち鳴らすとgccは文句なし上記をコンパイルするが、なぜ両方ではないでしょうか?私はconst int[5]
への非const参照をオブジェクトint[5]
のオブジェクトにバインドします。これはなぜ許可されていますか?
更新:同様の問題は、スティーブン・C.デューハーストによってC++ Gotchasでガッチャの#32(82ページ)で説明されて
あなたの最初の例では
も 'INT *のconst&P_REF {P}を考えます。'。 – Hurkyl
@Hurkylそれは普通のconst refを非const変数にバインドしているだけでしょうか? –
コンチネンタルコンプレックスの配置はこちらに関連しているようです:https://kuhllib.com/2012/01/17/continental-const-placement/ – Arvid