gpt4 book ai didi

c++ - 使用可变参数模板重载函数模板 : Intel c++ compiler version 18 produces different result from other compilers. intel 错了吗?

转载 作者:可可西里 更新时间:2023-11-01 16:20:13 27 4
gpt4 key购买 nike

考虑以下代码片段:

template<typename T, template<typename, typename ...> class A, typename ... Ts>
int a(A<T, Ts...> arg){
return 1; // Overload #1
}

template<typename A>
int a(A arg) {
return 2; // Overload #2
}

template<typename T>
struct S{};

int main() {
return a(S<int>());
}

在使用模板类的实例调用函数 a 时,我希望编译器选择更特殊的函数重载 #1。根据compiler explorer 、clang、gcc 和 17 版之前的英特尔实际上会选择重载#1。相反,后来的英特尔编译器版本(18 和 19)选择重载 #2。

是代码定义不正确还是最新的英特尔编译器版本有误?

最佳答案

以下fails to call a() 在 icc 19.01 上:

template<template<typename, typename ...> class A, typename T, typename ... Ts>
int a(A<T, Ts...> arg){
return 1;
}

template<typename T>
struct S{};

int foo()
{
return a(S<int>());
}

它根本无法考虑a()作为候选人,这就是问题中重载不同的原因。

C++17 draft说:

(其中 P 是模板模板参数,A 是实例化参数)

17.3.3 Template template arguments

  1. A template-argument matches a template template-parameter P when P is at least as specialized as the template-argument A. If P contains a parameter pack, then A also matches P if each of A’s template parameters matches the corresponding template parameter in the template-head of P.

到目前为止一切顺利,<int参数头匹配参数头 <T .

Two template parameters match if they are of the same kind (type, non-type, template), for non-type template-parameters, their types are equivalent (17.6.6.1), and for template template-parameters, each of their corresponding template-parameters matches, recursively.

看起来还是不错,intT匹配。

When P’s template-head contains a template parameter pack (17.6.3), the template parameter pack will match zero or more template parameters or template parameter packs in the template-head of A with the same type and form as the template parameter pack in P (ignoring whether those template parameters are template parameter packs).

这更难解析,但对我来说似乎没问题。据我了解,编译器应该将参数与模板模板参数相匹配。它明确地谈论零或更多,我们这里有零。

关于c++ - 使用可变参数模板重载函数模板 : Intel c++ compiler version 18 produces different result from other compilers. intel 错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55950080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com