在WG21 N0131中,Bill Gibbons指出:
默認引數通常被認為是不合時宜的,因為它們可以被多載函式所取代我的理解是,一個單一的函式如:
void f(T t = t0, U u = u0)。可以用三個多載來替代:
void f() { f(t0)。} void f(T t) { f(t, u0); } void f(T t, Uu);但我不明白的是,為什么后者要比前者更受歡迎? (這就是他所說的 "不合時宜 "的意思,對嗎?)
在Google的風格指南中,這里有一些相關的討論。Google C Styleguide > Default Arguments,但我看不出它如何回答這個問題或支持 Gibbons 的主張。
有誰知道他在說什么? 為什么默認論證被認為是一種無政府主義?
有人知道他在說什么嗎?
uj5u.com熱心網友回復:
我首先會參考這篇關于FluentC 的文章,它解決了這個問題,并在接近文章的頂部給出了明確的個人答案:
默認情況下,我認為我們應該傾向于使用默認引數而不是多載。
然而,正如默認情況下所暗示的那樣,作者在一些特殊的情況下給予了多載而不是默認引數的好處。
我的原始答案如下,但我不得不說:上面鏈接的文章確實大大減少了我對默認引數的排斥。
鑒于
void f(T t = t0, U u = u0);,你沒有辦法用一個自定義的u來呼叫f,而讓t成為默認的t0(除非你手動呼叫f(t0, some_u),顯然)。對于多載,這很簡單:你只需將
f(U u)添加到多載的集合中。所以通過多載,你可以做你可以用默認引數做的事情,而且還可以做更多。
此外,由于這個問題我們已經進入了意見的領域,為什么不提及你可以通過添加更多的默認值來重新宣告函式的事實呢?(例子來自cppreference。)
void f(int, int)。 // #1 void f(int, int = 7)。// #2 OK: 增加了一個默認的。 void f(int =1, int)。//#3確定,為#2增加一個默認值。還有,如果一個函式的前一個宣告定義了一個預設引數,那么該函式的定義就不能重新定義該引數(一個相當清楚和可以理解的理由)?
void f(int, int = 7)。//span>在頭檔案中 void f(int, int){}。//在cpp檔案中正確{}。 void f(int, int = 7) {}。//在一個cpp檔案中錯了。是的,也許默認引數是一個 "介面的東西",所以可能在實作檔案中沒有看到它的跡象是好的...
uj5u.com熱心網友回復:
從我自己的經驗來看,問題在于與其他語言特性互動時違反了最小驚奇原則。假設你有一個經常使用
f的組件。也就是說,你在很多地方都能看到這樣的情況:
f()。從閱讀中,你假設你有一個不需要引數的函式。所以當你需要添加與其他一些有注冊函式的組件的互動時:
void register(void (*cb)());你做明顯的事情...
register(f)。......然后你立即得到一個漂亮的閃亮的錯誤,因為
f的宣告型別是一個需要兩個引數的函式。Wtf!?所以你看了看宣告,明白了......對......默認引數使你的代碼通過編譯器 "篡改 "呼叫站點而表現出某種方式,以使事情順利進行。它并不是真的在呼叫一個沒有引數的函式,而是隱式地初始化了兩個引數來呼叫該函式。
另一方面,多載集確實表現出人們所期望的樣子。
uj5u.com熱心網友回復:
不合時宜的意思是,鑒于某些東西被廣泛認為是過去的東西,所以它在現在就很突出了。
我的答案的其余部分對于StackOverflow來說很糟糕,因為它是一個意見問題......但問題本身假定沒有一個硬性的 "答案"。
至于為什么默認引數會成為過去,可能有很多例子....,但我想到的最佳例子是,特別是在撰寫一組可重復使用的函式時,我們希望減少錯誤/不正確使用的可能性。
考慮以下情況:
void f(int i = 0, char c = 'A'){std: :cout << i << c << std::endl;}現在考慮一下,有人試圖使用它,如下:
f('B'/span>)。他們可能希望看到輸出:
0B然而他們得到的是:
66A一旦看到輸出,他們就會明白自己的錯誤并改正......但如果你洗掉默認引數,而是強制使用幾個特定的多載,以適應任何型別的單引數......那么你就做了一個更強大的介面,每次都能提供預期的輸出。 默認的引數是有效的......但是在開發程序中,如果有人忘記了在函式呼叫中至少提供一個引數,那么只有尾部的引數可以被默認,那么它們就不一定是最 "清晰 "的。
最終,重要的是代碼能夠作業......但如果你看到帶有標簽和goto陳述句的代碼,你會覺得:哦,真的嗎? 他們作業得很好......但是該死的,他們可能會被誤用...... 切換語言是為了強調討論的主觀性......如果JavaScript作業得很好,并且鑒于其變數具有可變型別的性質而提供了如此多的自由......為什么會有人想要使用TypeScript? 它是一個簡化/加強代碼的適當重復使用的問題。 否則,只要它能作業,誰會在乎呢......
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/333964.html
標籤:
上一篇:如何從登錄名匯出異步變數
