[英]Same function with same signatures in the same class/struct? Overload?
我在 boost 示例中看到了用於構建 state 機器的代碼部分。 讓我困惑的是這兩個成員函數ElapsedTime()? 這是否允許兩個函數具有相同的簽名,例如 function 名稱和參數類型?
我用谷歌搜索了很多但沒有找到相關信息。 對此的任何建議將不勝感激。
struct Active : sc::simple_state< Active, StopWatch, Stopped >
{
public:
typedef sc::transition< EvReset, Active > reactions;
Active() : elapsedTime_( 0.0 ) {}
double ElapsedTime() const { return elapsedTime_; }
double & ElapsedTime() { return elapsedTime_; }
private:
double elapsedTime_;
};
它們沒有相同的簽名 - 一個是const
而另一個不是。 Constness是成員函數簽名的一部分。
函數的簽名由名稱和參數類型定義。 你有兩個具有相同名稱的函數,但它們沒有相同的參數!
你可能想知道它怎么可能?
因此,每個成員函數都隱式獲取另一個參數:這是“this”指針。 指向調用該方法的對象的指針。
在方法的末尾添加const時,將“this”參數指定為const的const指針 。 在另一個方法(沒有const)中,“this”的類型只是const指針 。
因此,您有兩種具有不同簽名的方法,並且根本沒有問題。
簽名是不同的,因為一個具有const
限定符。 http://www.cprogramming.com/tutorial/const_correctness.html
這是允許的嗎
over.load#2.2狀態允許這種用法:
如果其中任何一個是 function 成員 function 聲明 ([class.static]),則不能重載具有相同名稱和相同參數類型列表的成員 function 聲明。 同樣,具有相同名稱、相同參數類型列表和相同模板參數列表的成員 function 模板聲明不能重載,如果它們中的任何一個是 static 成員 function 模板聲明。 為重載決策 ([over.match.funcs]) 的目的為成員函數構造的隱式 object 參數的類型在比較參數類型列表以執行此規則時不被考慮。 相反,如果在一組具有相同名稱和相同參數類型列表的成員 function 聲明中沒有成員 static 成員 function 聲明,則如果這些成員 function 聲明在其隱式 object 參數的類型不同,則可以重載. [示例:以下說明了這種區別:
(結束引用)
現在,在您的示例中,第一個重載具有const
限定符,這意味着其隱式 object 參數的類型為const Active&
而第二個重載沒有const
限定符,這意味着其隱式 object 參數的類型為Active&
。 此外,沒有 static 成員 function 聲明具有相同的ElapsedTime
-type-list 的 ElapsedTime。 因此,使用上面引用的語句,這意味着允許給定的用法。
請注意,當前接受的答案在技術上是不正確的,因為它聲稱this
是指向 const 的 const 指針。 但實際上,標准規定在const
限定成員 function 中, this
指針的類型為const X*
而在非 const 限定成員 function 中, this
指針的類型為X*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.