gpt4 book ai didi

c++ - 部分模板特化和 icc

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:02 24 4
gpt4 key购买 nike

考虑以下代码:

template <class T, class U, class V>
struct Foo { };

template <class T, class U>
struct Foo<T, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated";
}
};

template <class U>
struct Foo<double, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated special";
}
};

struct Bar {
static const int value = 0;
};

int main(int argc, char ** argv)
{
using Baz = Foo<double, Bar, std::integral_constant<int, 0>>;
Baz::print();

return 0;
}

当我使用 icc 16.0.1 编译它时,我收到以下消息:

main.cpp(38): error: more than one partial specialization matches the template argument list of class "Foo<double, Bar, std::integral_constant<int, 0>>"
"Foo<T, U, std::integral_constant<int, U::value>>"
"Foo<double, U, std::integral_constant<int, U::value>>"
Baz::print();

使用 clang 3.7.1 和 gcc 5.3.0 编译(并打印“instantiated special”)。这是 icc 中的错误,还是我的代码不正确?在我看来,第二个专业比第一个更专业。除了锁定第一个模板参数之外,它与第一个相同。

编辑:我应该补充:如果这是 icc 中的错误,是否有好的解决方法?

最佳答案

是的,这是 ICC 中的错误。


两个部分特化都与您的实现相匹配,因此进入两个合成函数的部分模板排序规则:

template <class T, class U> void f(Foo<T, U, std::integral_constant<int, U::value> ); 
template <class U> void f(Foo<double, U, std::integral_constant<int, U::value> );

部分排序规则涉及为每个模板参数合成新类型,并尝试对每个重载对其余部分进行推导。首先,我们尝试推断U反对Foo<_U1, _U2, std::integral_constant<int, _U2::value>> .这失败了,因为 _U1不匹配 double .所以第一个重载至少没有第二个重载那么专业。接下来,我们尝试推断TU反对Foo<double, _U3, std::integral_constant<int, _U3::value>> . T=double 成功和 U=_U3 .所以第二个重载至少和第一个一样专业。

因此,第二个重载比第一个更专业。有一个独特的最专业的局部化,它应该被实例化(并且由 gcc 和 clang 实例化)。 ICC 未能这样做是一个错误。

关于c++ - 部分模板特化和 icc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37216212/

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