簡體   English   中英

此模板類型推導和重載解析如何工作?

[英]How does this template type deduction and overload resolution work?

代碼#1

#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>

template <typename container>
void sort(typename container::iterator beginning,
          typename container::iterator end)
{
    std::cout << "calling custom sorting function\n";
}

int main()
{
    std::vector<int> v{1, 2, 3};
    sort(v.begin(), v.end());
}

Wandbox

代碼說明

它將調用std::sort函數,該函數由ADL發現。 雖然代碼如下:

代碼#2

#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>

template <typename Iterator>
void sort(Iterator beginning,
          Iterator end)
{
    std::cout << "calling custom sorting function\n";
}

int main()
{
    std::vector<int> v{1, 2, 3};
    sort(v.begin(), v.end());
}

Wandbox

導致模糊的過載錯誤。 所以我有兩個問題:

問題

  1. 如何在代碼#1中推斷出container

    據我所知,模板實例化期間的類型推導不能回溯成員類型以找到封閉的(在這種情況下為std::vector<int> )。

  2. 即使它可以回溯,為什么編譯時不會導致模糊的過載錯誤?

如何在代碼#1中推斷出container

由於非推斷的上下文 ,在模板參數推導期間無法推導出它,

1)使用qualified-id指定的類型的嵌套名稱說明符(作用域解析運算符::左側的所有內容):

這意味着您的sort根本不會被考慮用於重載解析,然后調用std::sort而不會產生歧義。

代碼#2沒有這樣的問題,你的sortstd::sort都是有效的候選者,然后導致模糊的重載錯誤。

暫無
暫無

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

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