相关疑难解决方法(0)

是否允许多个非类型模板参数包?

[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”的函数参数中推导出来

c++ templates language-lawyer c++11

6
推荐指数
1
解决办法
1275
查看次数

标签 统计

c++ ×1

c++11 ×1

language-lawyer ×1

templates ×1