内蔵のoperator&
オーバーロードの解決([over.match.oper]/3.3)に参加していません。 operator ,
については
、unary operator &
、またはoperator ->
、内蔵の候補が空で設定します。
は関係なく、あなたが
const
または非
const
A
のアドレスを取得しようとしているかどうかの
const A* operator&() const = delete;
以下の過負荷を削除したとして、あなたが宣言すると言う、上記の宣言が唯一の現実的な候補です、コンパイルエラーが発生します。
コメントアウトすると、内蔵されたoperator&
は[over.match.oper]/9となります。
オペレータは、operator ,
、unary operator &
、又はoperator ->
でと全く生存機能がない場合、オペレータは、内蔵オペレータであると仮定し、条項に従って解釈される[式expr ]。あなたが宣言した場合
今、唯一
A* operator&() = delete;
これはconst A
オブジェクトで呼び出すことができない非const
過負荷を削除したので、それは実行可能な候補者ではありませんとoperator&
ビルトインとしてが見つかります。 operator&
をオーバーロードクラスを扱う場合、インスタンスのアドレスを取得するためにstd::addressof
を使用することができます
Live demo
。
'const'メンバ関数は、非コンスオブジェクトに対して呼び出すことができます。あなたが何を期待しているのか分かりません。 –
@ T.C。可能ですが、呼び出されていなくてもエラーが発生します(xがconstでなく、constバージョンのみが削除されている場合)。これは逆の状況(非constバージョンのみが削除されたconst x)でも発生します。私はこれを明確にしようとしましたが、それは確かに難しいことです。 –
上記のコードでは、 'const A * operator&()const {...}'とコメントをつけて 'const A * operator&(const)delete = 'をアンコメントした場合、'コンス '' A'以外のオブジェクト。同様に、 'const A'のために他のコンビネーションのコメントをつける/コメントを外すことでコンパイルすることができます。あなたの質問は何ですか?コード内のこれらのコメントのすべてではなく、コンパイルされないすべてのバージョンを投稿してみてください。 – Praetorian