0

これをC++標準コンパイラで実行できるようにしたいと思います。

void DoSomething(Object* object) { }

DoSomething(&Object())

デフォルトのアドレス演算子を使用すると、構築されたオブジェクトをレジスタに保存してから、DoSomething()で上書きします...すべてのオブジェクトに対して1行でこれを行うと非常に便利です(オーバーライドできない基本タイプを除く)。彼ら)。

これが私が持っているものです:

class Object
{
    public:
        Object* operator&(Object object) { return &object; }
};

これは明らかに、オーバーライドされたものではなく、基本的な&演算子が必要であることを指定できずに繰り返されるループになります。DoSomething(&Object())を呼び出しても呼び出されません。これは可能ですか?複雑なタイプの初期化がはるかに簡単になるので、それは一種の重要です。

4

2 に答える 2

4

C++11 では次のようにできます。

class Object
{
    public:
};

Object* operator&(Object&& object) { return std::addressof(object); }
Object const* operator&(Object const&& object) { return std::addressof(object); }

すべてのオブジェクト:

template<typename T>
T* operator&(T&& x) {
    return std::addressof(x);
}

ただし、これを行わないでください。人々はそれであなたを憎むでしょう。

于 2013-01-05T20:26:07.693 に答える
0

通常、 C++ ではそれを行いません。それを行う方法はありますが、トラブルを求めているだけです。代わりに、C++ソリューションは次のようになります。

void DoSomething( Object const& object ){ ... }

しかし、非 constオブジェクトも操作できる必要があるかもしれません。その場合、次のようにします。

void DoSomething( Object& object ){ ... } // operate on an lvalue, object with a name
void DoSomething( Object&& object ){ ... } // operate on an rvalue, either temporary or moved object

解決策は、実際に何をしようとしているのかによって大きく異なります。

于 2013-01-05T20:27:31.273 に答える