2017-09-25 120 views
7

我看到很多不同的地方統一初始化是recommended。草藥Sutter recommends它,並給出了當不是使用它的列表。看來普遍的共識是使用這種語法。爲什麼建議統一初始化(使用大括號初始化)?

但是,我不明白爲什麼。它有std::initializer_list優先。將一個std::initializer_list添加到類中可能會破壞代碼。使用模板時,不建議使用。它似乎比「舊」的方式有更多的例外。舊的方式都不存在這些問題。

我看不出爲什麼統一初始化更好。我的結論是繼續使用()語法,並在當我想調用構造與std::initializer_list的情況下使用{}

爲什麼?統一初始化給了什麼?

  • 禁止縮小:很好的功能。但是,由於我縮小了警告,所以我的代碼打開了全部(因爲我想知道我的代碼中的所有縮小,而不僅僅是初始化),所以我不需要太多這個功能。
  • 最令人頭疼的解析:是的,這是一個問題,但我非常少見。所以這不是一個理由(對我來說)切換。這個地方,我可以用{}
  • 還有什麼(也許,我還在學習C++的新功能)?

隨着「老」的方式,沒有規則要記住,沒有可能的破解代碼。只要使用它,有時候,非常非常罕見的是,您會遇到最令人頭疼的解析。就這樣。

我的思維錯了嗎?

+7

它有助於瞭解什麼是功能,什麼是對象。 'f(g(),h(j,i));'不如'f(g {},h(i,j));'清楚。當變量具有專有名稱時,這仍然很重要。 – nwp

+0

@nwp:yepp,這是一個有效的論點。但是,我有一個命名約定,我可以立即看到類型。此外,當前良好的IDE可以通過某種方式(着色,斜體,無論)顯示它們之間的差異。 – geza

+4

您的命名約定不會被STL或其他各種庫所遵循。但是,當然,如果用一些外部工具替換支撐初始值設定項的大部分功能並單獨工作,或者強迫您周圍的人做同樣的事情,則不需要它們。並非每個C++功能對每個人都有意義。 – nwp

回答

0

好像你有技術方面的一個體面的保持和nwp提出的其他關注我要提到,清晰度中的註釋。所以我認爲你有需要做出決定的信息。

這就是說,我認爲這是值得倍增,並試圖強調清晰度方面的重要性。根據我的經驗,代碼清晰度可能是維護代碼庫中最重要的一件事。特別是在避免混淆和限制時間浪費在愚蠢的錯誤上。我想我們都有過花費太長時間調整一小段代碼的流程的經驗,最終才發現問題是對最初意圖的錯誤或誤解。

公平起見,這聽起來像你試圖通過堅持一種風格和工具來解決這個問題。標準理由,如nwp開始,很多人不會偏離語言內置的命名約定,也不會使用IDE。我個人對這一邏輯表示同情,但也明白爲什麼許多人將其視爲過時甚至是非問題(特別是對於IDE)。

當涉及到清晰度的問題,不過,我覺得很難不記住,人是在忽略小細節煩人的好,即使他們可能會幫助他們。所以更多的背景線索可以暗示問題可能會更好。語法突出顯示效果很好,但我不打賭在調試的某個晚上能夠注意到黃色而不是橙色。黃色和使用駱駝案件?也許。黃色和使用大括號?也許。

特別是當你開始進入別人編寫的代碼或者很久以前,所有這些小小的提示開始變得越重要。

在一天結束時,我認爲這就是爲什麼人們喜歡它足以推薦它。這件事在事情發生的時候可能會貼近你。


此外,一個備註迴應你對窄化的評論。爲縮小而啓用警告可能允許您暫時忽略此優點,但在許多情況下,人們1)由於遺留代碼而無法啓用此類警告,或2)不希望啓用此類警告,因爲它們故意依賴此類行爲某些情況下,會認爲這些警告是令人討厭的。但是,在任何情況下采用列表初始化都可能有助於防止潛在問題,同時也可以明確指定特定代碼行的意圖。

爲了說明問題,人們都有不同的情況和偏好。像這種增加的方式,人們可以提高他們的代碼質量/可讀性,同時仍然可以在他們可能有的任何限制(自行強加或以其他方式)內工作。

+0

一般來說,我同意你的看法。我只是沒有看到這個問題。在很多情況下,「a()」是函數調用還是構造函數都無關緊要。兩者都「返回」一個對象。我在這裏唯一接受的是''''可以幫助更好地理解代碼。但是當你試圖理解別人的代碼時,你最好使用它的工具。例如,使用調試器,您可以更輕鬆地執行代碼所需的路徑等。您爲傳統代碼啓用警告的要點絕對有效。 – geza

+0

所以是的,有不同的情況,偏好。這就是爲什麼我覺得'{}'被認爲是優越的東西,而一般的建議是:「使用它」。在我看來,這個建議必須改變成更復雜的東西。 – geza

+0

@geza我想這就是建議。我傾向於把這樣的建議看作是暗示「如果你沒有理由不這樣做」。通常我認爲人們在明確包含這些免責聲明時很謹慎,以防新程序員可能使用該邏輯來寫出有用的功能。此外,特別是對於像C++這樣的語言,我認爲人們傾向於支持讓編譯器爲您做額外工作的功能,並相信您會在繼續之前瞭解錯誤的真正含義,並將其視爲淨效益在那光。 – thesquaregroot