Mak*_*s_F 6 c++ templates language-lawyer compiler-bug template-meta-programming
我试图理解为什么我使用两个应该与我等效的模板得到不同的行为
给定
template<template<typename...> class TT, typename T1, typename T2>
class A {};
Run Code Online (Sandbox Code Playgroud)
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
{
};
Run Code Online (Sandbox Code Playgroud)
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
{
};
Run Code Online (Sandbox Code Playgroud)
我希望当 A 用 3 个参数实例化时,这 2 个版本的行为相同,但事实并非如此
参见代码编译https://wandbox.org/permlink/MjSwFLvWmH0n1QLk
我希望is_a在任何is_a2可以工作的地方工作。
这是我应该报告的编译器错误吗?
编辑
显然这适用于 clang https://wandbox.org/permlink/9n5pXUGtBa8cAvFw