簡體   English   中英

如何顯式調用轉換類型 ID 包含占位符說明符的轉換 function

[英]How to explicitly call a conversion function whose conversion-type-id contains a placeholder specifier

struct A{
  operator auto(){
     return 0;
  }
};
int main(){
   A a;
   a.operator auto(); // #1
   a.operator int(); //  #2
}

GCC接受 #2 是明確調用轉換 function 的正確方法,而Clang接受 #1。

由於以下規則, #1似乎格式錯誤:
dcl.spec.auto#6

在本節未明確允許的上下文中使用 auto 或 decltype(auto) 的程序是格式錯誤的。

這種用法a.operator auto()在 [dcl.spec.auto] 部分中沒有明確允許,因此它應該是格式錯誤的。 但是,對於 GCC 接受的第二種用法,標准並沒有說conversion-type-id推導類型替換conversion-function-id表示轉換 function 的名稱。 換句話說,聲明中聲明的conversion-function-idoperator auto而不是operator int 前者與聲明的 declarator-id 具有相同的標記。 根據語法,unqualified-id operator auto應該是該轉換的名稱 function。 那么,如何顯式調用這個轉換function呢? 當轉換 function 包含占位符說明符時,它是否在標准中未指定?

似乎,這沒有足夠精確地指定。

  1. 10.1.7.4 The auto specifier

在這種聲明符有效的任何上下文中,占位符類型可以在 decl-specifier-seq、type-specifier-seq、 conversion-function-id或 trailing-return-type 中與 function 聲明符一起出現。

仔細閱讀,人們可能會在這里區分“可以”和更強的“只能”,即可能為編譯器內在函數的自由度打開空間(嚴格錯誤與未指定的行為)。

3.4.5 class member access說:

7 如果 id-expression 是轉換函數 ID,則首先在 object 表達式的 class 中查找其轉換類型 ID,如果找到,則使用名稱。

如果 auto 關鍵字在此上下文中可以有效地成為完全限定的轉換類型 ID,則再次留下解釋空間。

您的問題本身可能必須進一步分支,即

  1. 運算符 auto() 使用的重載規則是什么,即它是否應該可用於已經在 class 定義級別上的常規候選人競賽? (不是 Clang 和 Gcc 的情況,除了額外的運算符 int() 之外,它們都先驗地接受運算符...)
  2. 可以使用顯式成員運算符引用(您的情況 1)調用運算符 auto(),即有效地,它是否具有(唯一)可訪問名稱? 允許這將與關鍵字的所有其他明確允許的用例相矛盾。

我已經在幾個 clang 修訂版中看到了對此的明確測試,因此它的行為不是隱式命名約定應用的人工制品,而是明顯需要的行為。

正如評論中已經提到的那樣,至少與 gcc 相比,Clang 的行為在這里更加一致,因為它在那里完全清楚,其中 auto 關鍵字用於類型推斷以及名稱/函數 ID 解析的位置。 這里的操作符 auto() 被作為一個更明確的自己的實體處理,而對於 gcc,它具有類似於 lambda 的匿名字符,但即使對於顯式成員操作符訪問方式也參與了候選人競爭。

暫無
暫無

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

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