不止一次(即使是在SO上)我看过这样的代码:
template<typename U, typename... G, typename T = Traits<U>>
struct {
static_assert(sizeof...(G) == 0, "!");
// ...
};
或者这个:
template<typename T, typename... G, typename = std::enable_if_t<condition<T>>
void func(T &&t) {
static_assert(sizeof...(G) == 0, "!");
// ....
}
目的是避免用户通过这样的方式打破游戏规则:
template<typename T, typename = std::enable_if_t<std::is_same<T, int>>
void func(T &&t) {
// ....
}
// ...
func<int&, void>(my_int);
使用guard参数包时,无法覆盖默认值 另一方面,检查尺寸可以避免使用无用参数污染专业。
无论如何,由于[temp.res/8],我们有:
如果出现以下情况,该程序格式错误,无需诊断:
[...]
- 可变参数模板的每个有效特化都需要一个空模板参数包,或者
[...]
因此,包含上述片段的节目是否格式错误?
答案 0 :(得分:8)
&#34;技巧&#34;导致程序错误,无需诊断。
标准在您引用的部分中明确说明了这一点。