簡體   English   中英

為什么在重載函數中使用 const_cast?

[英]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引用來調用shorterStringconst版本。 該函數返回對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.

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