簡體   English   中英

C++ 中帶有多個參數包的 function 的過載解析

[英]Overload resolution for a function with multiple parameter packs in C++

一個C++ function可以有多個參數包。 雖然這看起來不是很實用的東西,但了解關於它們的語言規則還是很有趣的。

例如,在兩個重載的情況下:

constexpr int f(auto...) { return 1; }
constexpr int f(auto..., auto...) { return 2; }

調用沒有 arguments f f()的 f 在 MSVC 中選擇版本 1,在 Clang 中選擇版本 2,在 GCC 中選擇ambiguous overloaded call

如果使用參數f(1)調用f ,則 MSVC 和 GCC select 都是版本 1,而 Clang 仍然選擇版本 2。

演示: https://gcc.godbolt.org/z/PWr6h1dn1

哪個編譯器就在這里?

有一個類似的問題Function template overload resolution with two parameter pack ,但是

  • 那里的函數只有一個參數包作為 function 參數(第二個參數包只是未使用),
  • 那里的例子導致所有測試的編譯器出現歧義錯誤(但是提到的編譯器錯誤仍然沒有解決)。 實際上,在此示例中也可能會出現歧義,但此處大多數編譯器 select 是重載之一,沒有錯誤。

在這兩種情況下,這都將導致程序因不明確而被拒絕。

首先要注意的是

在 function 調用的上下文中,使用的類型是那些 function 參數類型,function 調用具有 arguments。

也就是說,只有提供的實際 arguments 有助於 function 模板部分排序。 因此,(2) 中前面 function 參數包的存在不會影響一個 function 模板對另一個模板的推導過程; 它被推斷為空的並且沒有進一步貢獻。

現在,帶有尾隨包的部分排序的決勝局無濟於事,因為兩者都有尾隨包:

[...] 如果G有一個尾隨的 function 參數包,而F沒有相應的參數包,並且如果F沒有尾隨的 function 參數包,那么FG更專業。

但是兩者都有一個尾隨參數包,並且長度相同,因此“ F沒有相應參數”的語言(不可否認,這並不完全清楚;請參閱CWG 1395 )也無濟於事。

我認為,如果提供了模板 arguments(並且它們是將要推導出的模板),那么 (2) 應該是首選,因為在這種情況下,其尾隨的 function 參數包將更短。 但這還不清楚; clang 同意我的看法,而 gcc 和 MSVC 則相反。

暫無
暫無

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

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