[英]Why const_cast in an overloaded function?
C++ Primer 一書的第 6.4 章聲明如下:
在第 4.11.3 節(第 163 頁)中,我們注意到
const_cast
在重載函數的上下文中更有用。 舉個例子,回憶一下第 6.3.2 節(第 224 頁)中的shorterString
函數:
const string &shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
此函數接受並返回對
const string
引用。 我們可以在一對非const string
參數上調用該函數,但我們將獲得對const string
的引用作為結果。 我們可能想要一個shorterString
的版本,當給定非const
參數時,它會產生一個普通的引用。 我們可以使用const_cast
編寫這個版本的函數:
string &shorterString(string &s1, string &s2)
{
auto &r = shorterString(const_cast<const string &>(s1), const_cast<const string &>(s2));
return const_cast<string&>(r);
}
此版本通過將其參數轉換為對
const
引用來調用shorterString
的const
版本。 該函數返回對const string
的引用,我們知道它綁定到我們原始的非const
參數之一。 因此,我們知道在返回時將該string
回普通string&
是安全的。
我的問題:與下面的代碼相比,這種方法有什么好處? 性能不會因為函數調用而受到影響嗎? 或者這只是一個不好的例子?
string &shorterString(string &s1, string &s2) {
return s1.size() <= s2.size() ? s1 : s2;
}
此示例具有誤導性,因為在這種情況下,初始函數是如此簡短和簡單,與您提出的第二個完整定義相比,該方法幾乎沒有優勢。
這個想法是你需要兩個版本的函數,一個有 const 參數和返回,另一個有引用參數和返回。 這不是一個很好的例子,因為重載函數和初始函數一樣長。
如果您假設初始的shorterString
函數相當復雜,那么重載的函數仍然只需要幾行代碼即可將引用參數轉換為const 並將返回const 轉換為引用。 通過采用這種方法,您可以擁有兩種不同的參數/返回行為,並且可以適當地重用而不是重復的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.