這個問題以前曾被問過,但我覺得當他從未真正得到真正的答案時,提問者會急於給出正確答案。也許沒有理由爲什麼,而這需要在後來的標準中,你告訴我。 What is the rationale to not allow overloading of C++ conversions operator with non-member functions爲什麼我不能在類之外重載C++轉換運算符,作爲非成員函數?
我正在尋找具體的原因,這不被允許作爲當前標準設計的一部分。基本上,當你重載一個轉換運算符來定義兩種類型之間的隱式轉換時,這個重載定義必須是你要轉換的類的成員,而不是類之外的東西。顯而易見的問題是,如果你的類型由於某種原因而無法修改,但爲了簡單的語法(儘管存在隱式轉換的弊端)或者因爲其他許多其他類型而想隱式轉換它們代碼,標準或自定義依賴於隱式轉換......如果您無法向類中添加適當的隱式轉換,則無法這樣做,因此您需要使用像常規函數這樣的變通方法來轉換,否則就是隱式轉換的方便。
另外,是否......真的有可能會有一個計算開銷在類之外添加這些轉換?我看到它的方式,編譯器很容易在找出可用的函數時,將外部隱式轉換函數與它們轉換的類相關聯,以便代碼被執行,就像它是該類的一部分一樣就效率而言。唯一的缺點是它需要做額外的工作來完成最初的關聯,這應該幾乎沒有任何影響。
我不會把「因爲標準如此說」或「因爲隱式轉換是不好的」作爲答案。當他們編寫實際的標準時,有人確實有理由。
(我不是一個巨大的專家,我還在學習的語言。)
編輯迴應: 嗯,我想這種情況可能是這樣的,是你改變了頭文件,但什麼你不這樣做是覆蓋現有的,因爲那會很糟糕。您將創建一個基於舊的頭文件來適應變化。假定舊代碼已經被編譯到一個目標文件中,並且更改標頭只是告訴編譯器在其他地方添加了其他代碼。它不會改變舊代碼的功能,因爲它已經被編譯並且不依賴於它(即某些供應商遞給你目標代碼和頭文件)。如果我可以修改和重新編譯我將使用的轉換代碼,那麼你不能讓我在外部編寫轉換函數,我不會這樣做,這太混亂了。您不必隨意搜索每個標題的正確定義;如果我自己編寫代碼,我會創建一個自定義標題,其中包含一個高度可見的部分,其中我添加到供應商提供的標題中的內容是,並且標題相對明顯,因爲它與哪個標題相關相關類型和其他標題將按其原始名稱命名,以便您知道它們未被更改。並且您將擁有僅包含轉換定義的相應文件,因此我的修改將自成體系,與原始目標代碼分開,並且相對容易找到。當然,除了在代碼中找出適用哪種轉換函數的實際困難以外。我認爲你可以找到各種各樣的案例,這些案例很容易確定,並且足夠自然,可以用於將自己的目的添加到現有庫這種情況下。如果我使用的是商業代碼,我無法真正修改,而且我看到了一種情況,即使用轉換函數將它與我自己的某些內容整合,我可以通過使用它來改進我所做的工作,我可以看到自己想要做的事情這個。當然,對於第三人來說,閱讀a = b並不是很明顯,但他們不知道我的轉換正在發生什麼,但是如果你知道並且它讀得很好,那麼它可以工作。
我很欣賞關於標準決策如何工作的見解,這絕對是一種你可以忽略的邊緣事物。
我真的不知道如何在評論部分給予長時間的回覆,所以我編輯了我原來的帖子在頂部 – Lunarian