可变参数模板的部分特化需要第一个非可变参数模板参数

Tob*_*ull 10 c++ partial-specialization variadic-templates c++11

以下代码

#include <iostream>
#include <utility>

template<typename F, typename... T>
struct Wrapper{ };

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

template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};

//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};

int main()
{
    Wrapper<int, double> w;

    std::cout << is_wrapper<decltype(w)>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

打印0.但是,如果取消注释中间的两行,则打印1.

为什么不总是打印1?第二部分专业化是否也应该涵盖显然仅由第三(评论)部分专业化所涵盖的案例?

Col*_*mbo 1

代码确实应该与部分特化相匹配;该标准实际上从未禁止这样做,但编译器确实需要一段时间才能正确实现可变参数模板及其推导。GCC 自 4.9.0 起符合要求,Clang 自 3.6 起符合要求。Clang 的相关错误报告是#22191(不过我找不到 GCC)。