我有一個功能address_of
,它返回一個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&]
我的印象是一元*
總是返回一個左值,在這種情況下甚至不應該考慮右值版本。這裏到底發生了什麼?
這很有道理,謝謝。關於如何實現我*做*想要的行爲的任何想法? – 2010-07-02 16:40:47
什麼是參考衰減? – 2010-07-02 16:42:18
@Jon - one。不積極,它會工作,但我把它放在我的答案。 – 2010-07-02 16:46:48