以下代码
#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;
}
打印0。但是,如果取消注释中间的两行,则打印1。
为什么不总是打印1?第二部分特化是否也不应覆盖似乎仅由第三(注释的)部分特化覆盖的情况?
最佳答案
该代码确实应该与部分特化相匹配。该标准从未真正禁止这样做,但是编译器确实花了一些时间来正确实现可变参数模板及其推导。从4.9.0版开始,GCC从3.6版开始符合Clang。有关Clang的错误报告是#22191(尽管我找不到GCC)。
关于c++ - 可变参数模板的部分特化需要第一个非可变模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18172958/