2015-12-03 16 views
2

這個問題以前曾被問過,但我覺得當他從未真正得到真正的答案時,提問者會急於給出正確答案。也許沒有理由爲什麼,而這需要在後來的標準中,你告訴我。 What is the rationale to not allow overloading of C++ conversions operator with non-member functions爲什麼我不能在類之外重載C++轉換運算符,作爲非成員函數?

我正在尋找具體的原因,這不被允許作爲當前標準設計的一部分。基本上,當你重載一個轉換運算符來定義兩種類型之間的隱式轉換時,這個重載定義必須是你要轉換的類的成員,而不是類之外的東西。顯而易見的問題是,如果你的類型由於某種原因而無法修改,但爲了簡單的語法(儘管存在隱式轉換的弊端)或者因爲其他許多其他類型而想隱式轉換它們代碼,標準或自定義依賴於隱式轉換......如果您無法向類中添加適當的隱式轉換,則無法這樣做,因此您需要使用像常規函數這樣的變通方法來轉換,否則就是隱式轉換的方便。

另外,是否......真的有可能會有一個計算開銷在類之外添加這些轉換?我看到它的方式,編譯器很容易在找出可用的函數時,將外部隱式轉換函數與它們轉換的類相關聯,以便代碼被執行,就像它是該類的一部分一樣就效率而言。唯一的缺點是它需要做額外的工作來完成最初的關聯,這應該幾乎沒有任何影響。

我不會把「因爲標準如此說」或「因爲隱式轉換是不好的」作爲答案。當他們編寫實際的標準時,有人確實有理由。

(我不是一個巨大的專家,我還在學習的語言。)

編輯迴應: 嗯,我想這種情況可能是這樣的,是你改變了頭文件,但什麼你不這樣做是覆蓋現有的,因爲那會很糟糕。您將創建一個基於舊的頭文件來適應變化。假定舊代碼已經被編譯到一個目標文件中,並且更改標頭只是告訴編譯器在其他地方添加了其他代碼。它不會改變舊代碼的功能,因爲它已經被編譯並且不依賴於它(即某些供應商遞給你目標代碼和頭文件)。如果我可以修改和重新編譯我將使用的轉換代碼,那麼你不能讓我在外部編寫轉換函數,我不會這樣做,這太混亂了。您不必隨意搜索每個標題的正確定義;如果我自己編寫代碼,我會創建一個自定義標題,其中包含一個高度可見的部分,其中我添加到供應商提供的標題中的內容是,並且標題相對明顯,因爲它與哪個標題相關相關類型和其他標題將按其原始名稱命名,以便您知道它們未被更改。並且您將擁有僅包含轉換定義的相應文件,因此我的修改將自成體系,與原始目標代碼分開,並且相對容易找到。當然,除了在代碼中找出適用哪種轉換函數的實際困難以外。我認爲你可以找到各種各樣的案例,這些案例很容易確定,並且足夠自然,可以用於將自己的目的添加到現有庫這種情況下。如果我使用的是商業代碼,我無法真正修改,而且我看到了一種情況,即使用轉換函數將它與我自己的某些內容整合,我可以通過使用它來改進我所做的工作,我可以看到自己想要做的事情這個。當然,對於第三人來說,閱讀a = b並不是很明顯,但他們不知道我的轉換正在發生什麼,但是如果你知道並且它讀得很好,那麼它可以工作。

我很欣賞關於標準決策如何工作的見解,這絕對是一種你可以忽略的邊緣事物。

回答

1
  1. 除了具有非顯式轉換運算符,例如, operator bool()在一個類中,您也可以使用非單純的構造函數來獲取單個參數,並將其轉換爲的類,作爲引入用戶定義的轉換的一種方法。 (未提及)

  2. 至於爲什麼你不能在兩種類型AB之間引入用戶定義的轉換,而不修改它們的定義......這會造成混亂。

    如果你可以這樣做,那麼你可以在一個頭文件中做,因爲引入新的用戶定義的轉換可以改變代碼的含義,這意味着只使用AB的「舊」代碼可以完全根據你的標題是否包含在它之前,改變它在做什麼,或者類似的東西。

    即使在限制轉換必須由兩種類型之一進行聲明的情況下,確定在出錯時確切地發生了用戶定義的轉換序列已經非常困難。如果你真的必須全搜索每一個不相關的頭文件來找到這些轉換函數的定義,那麼它會大大惡化維護問題,而且看起來沒有任何好處。我的意思是你可以給一個沒有人爲的例子,這個語言的特徵能夠幫助你實現更簡單或更易讀的東西嗎?

    在一般情況下,我覺得喜歡這個主意的程序員找出一條線a = b;呢,他們只需要閱讀的a類型和b類型的定義,並從那裏走......這是潛在的醜陋如果你開始允許這些難以瞭解的「難以捉摸」的轉換,那會很痛苦。

    我想你可以說正在使用與問候同樣的事情operator <<流媒體......但用戶定義的轉換的更嚴重,因爲它可能會影響任何行代碼,其中該類型的對象作爲參數傳遞。

另外,我不認爲你應該一定希望找到一個深思熟慮的原因,而不是家居編譯器來實現由標準允許的是可行的。委員會趨向於保守並尋求共識,因此「沒有人真正關心功能X足以爲它而戰」可能是一個很好的解釋,因爲你會發現爲什麼功能X不可用。

Why is initialization of a constant dependent type in a template parameter list disallowed by the standard?

回答這個問題提出了不是可用的特徵的常見原因:

  • 遺產:該功能是在第一位置離開了現在我們已經建立了很多,幾乎忘記了它(參見部分功能模板專業化)。
  • +0

    我真的不知道如何在評論部分給予長時間的回覆,所以我編輯了我原來的帖子在頂部 – Lunarian

    相關問題