1

C++ には戻り値の型に基づく正当なオーバーロードがないことを私は知っています。つまり、次のようなことはできません。

int operator ++ getOwner();
char operator ++ getOwner();

しかし、私は次のことに出くわしました:

https://stackoverflow.com/a/9569120/1376317

class Proxy
{
    My const* myOwner;
public:
    Proxy( My const* owner ) : myOwner( owner ) {}
    operator int() const
    {
        return myOwner->getInt();
    }
    operator char() const
    {
        return myOwner->getChar();
    }
};

私の質問は、この構成でオペレーターのオーバーロードがどのように機能するかです。この種のオーバーロードを取得するには、main.cpp でこれをどのように呼び出しますか。コンパイラは、正しいオーバーロードを呼び出す方法をどのように推測しますか?

4

6 に答える 6

3

私の質問は、この構成でオペレーターのオーバーロードがどのように機能するかです。

これらの演算子は、暗黙的な変換を提供します。つまり、このクラスはintorcharが期待される多くのコンテキストで使用でき、これらの演算子を使用して期待値を提供します。

この種のオーバーロードを取得するには、main.cpp でこれをどのように呼び出しますか。

以下に、暗黙的な変換の例をいくつか示します。

Proxy p = whatever();
int i = p;   // convert to int
char c = p;  // convert to char
long l = p;  // ERROR: ambiguous

void f(int);
f(p);        // convert to int

void g(int);
void g(char);
g(p);        // ERROR: ambiguous

通常のキャスト表記を使用して明示的な変換を要求することもできます。

long l = static_cast<int>(p);  // convert to int, then to long
g((char)p);                    // convert to char

コンパイラは、正しいオーバーロードを呼び出す方法をどのように推測しますか?

型の不一致がある場合は常に、コンパイラは変換シーケンスを探します。ルールは非常に複雑ですが、基本的にシーケンスには、 to などの標準的な変換だけでなく、最大 1 つのユーザー定義変換(このような演算子または変換構造を使用) を含めることができます。intlong

于 2013-09-04T15:50:51.047 に答える
0

それがプロキシであるという事実は無関係です。同じことがどのクラスでも機能します。これらは変換演算子であり、コンパイラ呼び出し元のコードでの使用方法に基づいて適切なバージョンを選択します。

struct S {
    operator int() const { return 1; }
    operator double() const { return 2.0; }
};

int main() {
    S s;
    int i = s;
    double d = s;
    std::cout << i << ' ' << d << '\n';
    return 0;
}
于 2013-09-04T15:48:25.050 に答える
0

コンパイラは、変換呼び出しのコンテキストに基づいて「認識」します。たとえば、次のようになります。

Proxy p;

// p_int will be set equal to p.my_owner->getInt()
int p_int = p;

// p_char will be set equal to p.my_owner->getChar()
char p_char = p;
于 2013-09-04T15:48:07.633 に答える
0

上記のコードは型変換用であり、型をandoperatorにキャストする暗黙的な方法を提供します。Proxyintchar

于 2013-09-04T15:46:49.770 に答える