2010-02-25 17 views
0

內部提升有boost::detail::addr_impl_ref結構,基本上有一個構造函數接受T&引用和超載operator T&()返回該引用。它是在boost::addressof()實現中使用:boost :: detail :: addr_impl_ref的用途是什麼?

template<class T> T* addressof(T& v) 
{ 
    return boost::detail::addressof_impl<T>::f(boost::detail::addr_impl_ref<T>(v), 0); 
} 

boost::detail::addressof_impl<T>::f()接受T&作爲第一個參數。 boost::addressof<T>()也有T& v作爲參數。

爲什麼boost::detail::addr_impl_ref()臨時對象用於存儲和返回T&而不是僅僅通過T& v

+0

可能一種解決方法以避免調用'OP&()'? – dirkgently 2010-02-25 11:50:07

回答

2

它可以防止T的其他隱式轉換運算符成爲轉換的一部分。

編輯:例如:

struct foo 
{ 
    operator foo*() 
    { 
     return 0; 
    } 
}; 
+0

您能否提供一個不使用該功能會出錯的例子? – sharptooth 2010-02-25 11:53:30

+0

你的意思是說,提供的boost :: detail :: addressof_impl :: f(T *)可以被調用嗎?這是唯一可能的問題嗎? – sharptooth 2010-02-25 12:05:13

+0

是的,沒有它,兩個'addressof_impl :: f'重載都有類似的轉換,導致編譯時錯誤。 – dalle 2010-02-25 12:10:58