20

単項 & 演算子に適用される特別なルールはありますか?

たとえば、コードは次のとおりです。

#include <iostream>
struct X
{
    X() {}
    void* operator &() { return NULL; }
};
int main()
{
    const X x;
    std::cout << &x << std::endl;
    X y;
    std::cout << &y;
}

出力を生成します

0xbfbccb33
0

以前にここで議論したので、これがコンパイルされてこのように実行されることはわかっていましたが、これを知らなかったら、operator &宣言されていないため、コンパイルに失敗すると予想していましたconst

そのため、オーバーロードされているoperator &() constかどうかに関係なく、コンパイラが生成するようです。operator &()これは、特にサンプルと出力に関しては理にかなっています。

問題は、この動作が標準のどこに詳述されているかです。

質問で既に述べたことを繰り返す回答を探しているわけではないので、オーバーロードされた演算子をconstオブジェクトで呼び出せない方法を説明しないでください。

4

1 に答える 1

14

n3337 13.3.1.2/9

演算子が演算子 ,、単項演算子 &、または演算子 -> であり、実行可能な関数がない場合、演算子は組み込み演算子であると見なされ、条項 5 に従って解釈されます。

于 2012-10-22T08:22:30.520 に答える