2017-08-14 4 views
1

私は参照にバインドすることで、値のアドレスを取ることができます(理解しているように、それは左辺値によってのみ参照できます)。私は直接住所を取ることができる価値がありますか?

住所を直接取ることができる方法はありますか(つまり&(<rvalue>)は有効な表現で、operator&()を上書きしないでください)。

他の値に「バインディング」することで可能なのでしょうか? (これは、左辺値である参照にのみバインドすることができるため、上記のようなものではないようですが、ここでは似たような概念がいくつかあります)。答えは以下のことが当てはまるかどうかです。rvaluesは、左辺値のビットフィールドやその他の特殊な種類の左辺値を除いて、アドレスを直接取ることができる式のセットに厳密に対応します。

+0

左辺値内に右辺値が隠されていない限り、左辺値の定義に矛盾するので、そのアドレスを「&」とすることはできません – AndyG

+0

言語弁護士はタグですか?私に笑いを込めました – arynaq

+0

'' std :: addressof() '](http://en.cppreference.com/w/cpp/memory/addressof)を見てください。これは' operator& 'をオーバーライドするクラスの問題を扱っています。 –

答えて

3

[expr.prim.id.qual]

ネスト名指定子随意 続いてクラスを表しをキーワードtemplate([temp.names])が、次いで メンバーの名前が続きますクラス([class.mem])または基底クラスのいずれか( クラス)のいずれかが、修飾IDです。 [class.qual]修飾されたIDに表示される クラスメンバーの名前検索を説明します。結果はメンバーです。 結果のタイプはメンバーのタイプです。 メンバが静的メンバ関数またはデータメンバの場合、結果は 左辺値です。そうでない場合は です。非静的メンバ関数へのポインタ・ツー・メンバーを作成する、ある

はprvalueに&オペレータを適用しています。

+0

これは唯一のケースです(ご存知ですか)? – ledonter

+0

@ledonterオーバーレイされた 'operator&'でクラスのrvaluesを含める場合を除き、AFAICSはおそらく唯一のケースです。 – Columbo

+0

私は確信していません。 '&(Foo :: bar)'がうまく構成されていないので、あなたは本当にそのアドレスを取っていません。特別な形式の '&Class '::' Member | {メンバーはクラスの非静的なデータメンバーです} 'は'&式|の代わりに翻訳されています。 {式はprvalue} 'となります。つまり、(&()のように、演算子&()をオーバーライドしないと有効な式になります。つまり、それはトリックポストであることを理解していますので、私はあなたの答えに全く同意しません。 ) –

関連する問題