簡體   English   中英

一元運算符重載&

[英]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);

問題如下:

是否有任何語法的地址傳遞af 如果否,那么對我來說,為什么允許它重載一元運算operator &很奇怪,因為它使代碼更容易出錯且難以理解。 還是有其他原因?

是否有任何語法的地址傳遞af

是的,語法很丑陋:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM