[英]Overloading unary operator &
讓我們考慮一元運算符&(Address-of)重載的類。 讓它成為class A
template <class C>
class A
{
public:
C * operator &()
{
return &data;
}
//...
private:
C data;
}
現在,我想向某個函數傳遞類型為A
的指針以填充其data
。 讓我們稱它為f
void f(A * auto_containter)
{
//...
}
但是很明顯,為什么下面的代碼行不通(甚至無法編譯)。 這是因為調用了重載運算符。
A a;
f(&a);
問題如下:
是否有任何語法的地址傳遞a
以f
? 如果否,那么對我來說,為什么允許它重載一元運算operator &
很奇怪,因為它使代碼更容易出錯且難以理解。 還是有其他原因?
是否有任何語法的地址傳遞
a
以f
?
是的,語法很丑陋:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
是一個不錯的通用包裝器。
使用boost::addressof
函數。 無論如何,一元和超載是高度可疑的。 為什么不使用命名函數返回數據地址呢?
有什么語法可以將a的地址傳遞給f?
其他人已經指出boost::addressof
。 它所依賴的機制是內置地址運算符的標准保證用法,用於將reinterpret_cast
為引用類型。 Boost函數只是包裝了相當冗長而笨拙的轉換組合。
如果否,那么對我來說,為什么允許重載一元運算符&很奇怪,因為如果這樣做會使代碼更加錯誤且難以理解。 還是有其他原因?
在某些情況下,它可能更方便。 例如,智能指針類可能會提供一個自定義地址運算符 ,以支持將&p
作為實際參數寫入T**
形式參數。 但是,我認為,如今,人們普遍認為這並不是一個好主意。
干杯,……
為什么您要重載一元運算operator&
?
除此之外,還有boost::addressof
。
這就是為什么發明了boost::addressof
原因。
您的情況永遠不會真正出現,因為編寫該函數的任何人都將引用而不是指針。 另外,您忘了使用C的示例類型實例化A。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.