関数があり、引数に(カプセル化された)address_of
を返します。は左辺値と右辺値の両方で動作する必要があるため、 には 2 つのバージョンがあります。1 つは参照を受け入れ、もう 1 つは右辺値参照を受け入れます。テンポラリーのアドレスを取得することは悪いことなので、 の右辺値バージョンは、が実際に何かを所有するためにムーブ コンストラクトを実行する必要があります。実装は簡単です:Pointer
shared_ptr
address_of
address_of
address_of
Pointer
template<class T>
inline Pointer address_of(T& value) {
return Pointer(&value);
}
template<class T>
inline Pointer address_of(T&& value) {
return Pointer(new T(std::move(value)));
}
そして、期待どおりに一時的な作品のアドレスを取得します。
Pointer p = address_of(Derived());
しかし、次のコードでテストすると:
Base* object = new Derived();
Pointer p = address_of(*object);
GCC は、への呼び出しaddress_of
があいまいであると文句を言います。
error: call of overloaded ‘address_of(Base&)’ is ambiguous
note: candidates are: Pointer address_of(T&) [with T = Base]
note: Pointer address_of(T&&) [with T = Base&]
単項*
は常に左辺値を返すという印象を受けました。その場合、右辺値のバージョンは考慮されるべきではありません。ここで何が起こっているのですか?