首頁  >  文章  >  後端開發  >  為什麼在 C 中隱式轉換為「std::string」時重載解析會失敗?

為什麼在 C 中隱式轉換為「std::string」時重載解析會失敗?

Linda Hamilton
Linda Hamilton原創
2024-11-06 06:26:02574瀏覽

Why Does Overload Resolution Fail with Implicit Conversion to `std::string` in C  ?

隱式轉換導致重載解析失敗

嘗試使用隱式轉換到字串來串流傳輸物件時,可能會發生重載解析失敗。下面的程式碼說明了這一點,它定義了一個隱式轉換為字串的結構體和一個將物件流式傳輸到標準輸出的函數:

<code class="cpp">#include <string>
#include <ostream>
#include <iostream>

struct NameType {
   operator std::string() { return "wobble"; }
};

struct Person {
   NameType name;
};

int main() {
   std::cout << std::string("bobble");
   std::cout << "wibble";

   Person p;
   std::cout << p.name;
}</code>

當使用GCC 4.3.4 編譯時,此程式碼產生以下錯誤:

prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

出現此錯誤是因為重載集中未考慮自由函數運算子

C 98 標準部分14.8.1/4 聲明對函數參數執行隱式轉換以將其轉換僅當參數類型不包含參與模板實參推導的模板參數時,才轉換為相應函數參數的類型。在這種情況下,所需重載的所有參數都包含參與範本參數推導的範本參數,因此它們都無法從隱式轉換中取得其值。

因此,重載解析失敗,且報告錯誤。

以上是為什麼在 C 中隱式轉換為「std::string」時重載解析會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn