参数包的部分专业化行为与手动扩展的行为不同

时间:2018-09-01 15:55:14

标签: c++ templates language-lawyer template-meta-programming compiler-bug

我试图理解为什么为什么我使用2个应该与我等效的模板来获得不同的行为

给予

template<template<typename...> class TT, typename T1, typename T2>
class A {};

is_a是通用版本

template<typename T>
struct is_a : std::false_type
{
};

template<template<typename...> class TT, typename... T>
struct is_a<A<TT, T...>> : std::true_type
{
};

is_a2是已手动扩展为2种类型的版本,而不是参数包。

template<typename T>
struct is_a2 : std::false_type
{
};

template<template<typename...> class TT, typename T1, typename T2>
struct is_a2<A<TT, T1, T2>> : std::true_type
{
};

当用3个参数实例化A时,我希望这2个版本具有相同的行为,但事实并非如此

请参见编译https://wandbox.org/permlink/MjSwFLvWmH0n1QLk

的代码

我希望is_ais_a2工作的任何地方工作。

这是我应该报告的编译器错误吗?

编辑

显然,这适用于clang https://wandbox.org/permlink/9n5pXUGtBa8cAvFw

0 个答案:

没有答案