据推测,除非使用模板类,否则不应对其进行实例化.然而,这个示例似乎实例化了do_something成员和enable_if失败(如果我们实例化它会是预期的 - 但是AFAIK我们没有实例化).
我错过了一些非常基本的东西吗?
#include <string>
#include <boost/utility.hpp>
struct some_policy {
typedef boost::integral_constant<bool, false> condition;
};
struct other_policy {
typedef boost::integral_constant<bool, true> condition;
};
template <typename policy>
class test {
void do_something(typename boost::enable_if<typename policy::condition>::type* = 0) {}
};
int main() {
test<other_policy> p1;
test<some_policy> p2;
}
Run Code Online (Sandbox Code Playgroud)
[temp.param] p11 说(在 N4527 中):
(...) 一个函数模板的模板参数包后面不能跟另一个模板参数,除非该模板参数可以从函数模板的参数类型列表中推导出来或者有一个默认参数
在非类型模板参数包的上下文中,不能有默认参数,
那么究竟需要为包推导出什么(只是类型或值)?
即我想知道标准(C++11、14 或 1z)是否允许这样做:
template<typename T, T... A, T... B>
void foo(T) {}
Run Code Online (Sandbox Code Playgroud)
第一个包的值可以明确指定,但第二个包是“无法访问的”,如果我没记错的话,它总是为空的。
clang++-3.6 和 g++-5.2 似乎接受这些空的无法访问的包(甚至非非类型包),但 VC++ 14.0 拒绝它们并显示错误:
错误 C3547:无法使用模板参数“B”,因为它遵循模板参数包并且无法从“foo”的函数参数中推导出来