模板模板参数推导对Clang和MSVC失败,但对GCC成功

时间:2019-07-18 22:33:35

标签: c++ templates c++17 stdvector template-templates

考虑以下代码:

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

template <typename T, template <typename> typename U>
T get_max(U<T>& gr) {
    return *std::max_element(gr.begin(), gr.end());
}

int main() {
    std::vector<int> c = {1, 2, 3};
    get_max(c);
}

在上述代码的GCC accepts中,Clang和MSVC reject表示参数(std::vector)具有不同的类型(std::vector有两个template参数,但我只介绍了一个):

<source>:14:5: error: no matching function for call to 'get_max'
get_max(c);
^~~~~~~
<source>:7:3: note: candidate template ignored: substitution failure [with T = int]: template template argument has different template parameters than its corresponding template template parameter
T get_max(U<T>& gr) { 
  ^
1 error generated.
Compiler returned: 1

哪个编译器是正确的?

据我所知,GCC是正确的,因为第二个template类型是可推论的(由于默认类型),但是由于实际的签名不匹配,这可能不是合法代码。

0 个答案:

没有答案