2016-12-17 7 views
2

少なくとも単項では&とunary -と表示されますが、GCCは演算子の非constバージョンとconstバージョンの両方を削除できるようにします(おそらく2項演算子に影響しますが、チェックしません)。以下のコメントで説明したように、私は正常にconstに基づいてオーバーロードすることができますが、私は個別にコンパイルエラーに実行せずにconstまたは非constの過負荷を削除することはできません。この動作は標準に準拠していますか?それは直観に反しているようです。メソッドのconstオーバーロードしか削除できませんか?

GCC 5.4.0でテストされました。

​​
+0

'const'メンバ関数は、非コンスオブジェクトに対して呼び出すことができます。あなたが何を期待しているのか分かりません。 –

+0

@ T.C。可能ですが、呼び出されていなくてもエラーが発生します(xがconstでなく、constバージョンのみが削除されている場合)。これは逆の状況(非constバージョンのみが削除されたconst x)でも発生します。私はこれを明確にしようとしましたが、それは確かに難しいことです。 –

+0

上記のコードでは、 'const A * operator&()const {...}'とコメントをつけて 'const A * operator&(const)delete = 'をアンコメントした場合、'コンス '' A'以外のオブジェクト。同様に、 'const A'のために他のコンビネーションのコメントをつける/コメントを外すことでコンパイルすることができます。あなたの質問は何ですか?コード内のこれらのコメントのすべてではなく、コンパイルされないすべてのバージョンを投稿してみてください。 – Praetorian

答えて

4

内蔵の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


関連する問題