[英]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 調用的上下文中,使用的類型是那些 function 參數類型,function 調用具有 arguments。
也就是說,只有提供的實際 arguments 有助於 function 模板部分排序。 因此,(2) 中前面 function 參數包的存在不會影響一個 function 模板對另一個模板的推導過程; 它被推斷為空的並且沒有進一步貢獻。
現在,帶有尾隨包的部分排序的決勝局無濟於事,因為兩者都有尾隨包:
[...] 如果
G
有一個尾隨的 function 參數包,而F
沒有相應的參數包,並且如果F
沒有尾隨的 function 參數包,那么F
比G
更專業。
但是兩者都有一個尾隨參數包,並且長度相同,因此“ F
沒有相應參數”的語言(不可否認,這並不完全清楚;請參閱CWG 1395 )也無濟於事。
我認為,如果提供了模板 arguments(並且它們是將要推導出的模板),那么 (2) 應該是首選,因為在這種情況下,其尾隨的 function 參數包將更短。 但這還不清楚; clang 同意我的看法,而 gcc 和 MSVC 則相反。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.