功能模板与Variadic模板过载:Intel C 编译器版本18产生的结果不同于其他编译器.英特尔是错误的
Function template overloading with variadic templates: Intel c++ compiler version 18 produces different result from other compilers. Is intel wrong?
考虑以下代码段:
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。根据编译器资源管理器的说法,Clang,GCC和Intel升至版本17实际上确实选择了Overload#1。相比之下,后来的英特尔编译器版本(18和19(选择Overload#2。
代码定义不明,还是最新的英特尔编译器版本错误?
以下未能在ICC 19.01上致电a()
:
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草稿说:
(其中p是模板 - 网板参数,a是实例化参数(
17.3.3 模板模板参数
- 模板 - 题词与模板模板参数p匹配,当p至少与 template-argumentA。如果P包含一个参数包,则A还匹配P,如果A的每个模板参数 匹配第
的模板头中的相应模板参数
到目前为止很好,<int
参数头与参数头 <T
匹配。
两个模板参数匹配 如果它们是相同的(类型,非类型,模板(,对于非类型模板 - 参数,则它们的类型是 等效(17.6.6.1(,和对于模板模板 - 参数,每个相应的模板参数 递归匹配。
看起来不错,int
和T
匹配。
当P的模板头包含模板参数包(17.6.3(时 参数包将匹配零或更多模板参数或模板参数包中的模板头组件包 与p中的模板参数包相同类型和形式的A(忽略这些模板是否 参数是模板参数包(。
这很难解析,但是对我来说似乎还可以。据我了解,编译器应该将参数与模板网板参数匹配。它明确地谈论了零或更多,我们在这里零。
相关文章:
- 代码未在联机编译器上显示结果
- C++编译器能在编译时计算出文字的除法结果吗
- 在 C++ 中使用带有正则表达式的 G++ 和 Visual Studio 14 2015 编译器时会产生不同的结果
- 如何让编译器忽略这个计算结果为 false 的 if-constexpr?
- Web 编译器输出奇怪的结果
- 为什么>>运算符在不同的编译器上显示不同的结果?
- 功能模板与Variadic模板过载:Intel C 编译器版本18产生的结果不同于其他编译器.英特尔是错误的
- 重用编译器前端的结果,以加快多个配置/平台的C++代码编译
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 在不同的平台/编译器上实现相同的浮点计算结果
- 用名称为“ this”内部括号内的变量在3个不同的编译器上导致不同的结果
- 使用FP:快速导致错误的VC 结果(不仅仅是不准确)结果 - 这是编译器错误
- 在编译时拆分字符串在不同的编译器上会得到不同的结果
- 在不同的编译器中运行c++代码会产生不同的结果吗
- 正弦结果取决于使用的C++编译器
- 为何分配给基本呼叫的结果,为什么不是编译器错误
- 记忆错误结果的说明[编译器行为]
- (int)-2147483648的结果使用不同的编译器除以(int)-1
- 可能的编译器错误:在两台机器之间使用英特尔编译器的boost bessel函数会产生奇怪的结果
- Flex Bison构造的编译器打印正确的结果,然后给出语法错误