簡體   English   中英

用戶定義的轉換函數和轉換引用

[英]User-defined conversion function and casting to reference

我遇到以下代碼的編譯錯誤:

class SymbolGroup
{
  std::string d_;

public:
  SymbolGroup(std::string a):d_(a){}

  // explicit operator const std::string&() const { return d_;} // compiles
  explicit operator std::string() const { return d_;} // Does not compile
};

inline
bool operator==(const SymbolGroup& lhs, const SymbolGroup& rhs)
{
  return static_cast<const std::string&>(lhs) ==
    static_cast<const std::string&>(rhs);
}

int main(){

  SymbolGroup a("hello");
  SymbolGroup b("hello");

  if (a==b)
    std::cout << "they are the same\n";

  return 0;
}

如果沒有用戶定義的類型轉換行中的'const'和'&',則不能使用--std = c ++ 11標志在g ++(4.8)中編譯:

錯誤:從類型'const string {aka const std :: basic_string}'表達式的表達式'std :: string&{aka std :: basic_string&}'類型的引用的無效初始化'顯式運算符std :: string&()const {return d_; }

代碼在兩個方面編譯Clang。 哪個編譯器正確? 這段代碼應該用operator std::string()編譯嗎?

更新我以前的回答是完全錯誤的。 道歉! tldr; clang接受代碼是正確的,gcc拒絕它是不正確的。


首先,來自[expr.static.cast]:

如果聲明T t(e) ,則可以使用static_cast<T>(e)形式的static_cast<T>(e)將表達式e顯式轉換為類型T. 對於一些發明的臨時變量t(8.5),其形式良好。

因此,我們有效地嘗試從SymbolGroup const&類型的對象直接初始化std::string const&類型的對象。 有一節專門用於通過轉換函數初始化引用:“通過轉換函數初始化直接引用綁定”[over.match.ref]:

在8.5.3中指定的條件下,引用可以直接綁定到glvalue或類prvalue,它是將轉換函數應用於初始化表達式的結果。 重載分辨率用於選擇要調用的轉換函數。 假設“ cv1 T”是初始化的引用的基礎類型,並且“ cv S”是初始化表達式的類型,S是類類型,候選函數選擇如下:

- 考慮S及其基類的轉換函數。 那些[...]是候選函數的非顯式轉換函數。 對於直接初始化,那些未隱藏在S中的顯式轉換函數和產生類型“左值引用cv2 T2”或“ cv2 T2”或“rvalue reference to cv2 T2”,其中T2與T的類型相同或者可以轉換為帶有資格轉換(4.4)的類型T,也是候選函數。

第一部分不適用,因為我們的轉換函數是explicit ,所以我省略了它。 第二部分呢。 我們有cv1 T是const std::string ,所以我們對std::string轉換函數是候選函數,因為std::string可以通過限定轉換轉換為const std::string


gcc在這里是錯誤的,我提交了錯誤66893 ,由我們自己的C ++專家和好人Jonathan Wakely以及主管Clang開發人員和C ++標准編輯Richard Smith(在我徹底尷尬地自己提交Clang錯誤之后)確認。

先生,答案非常簡單。 而不是像這樣轉換為const引用作為回報:

return static_cast<const std::string&>(lhs) == static_cast<const std::string&>(rhs);

將您的類型轉換為std::string

return static_cast<std::string>(lhs) == static_cast<std::string>(rhs);

並享受工作代碼:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM