检查防护参数包是否是导致格式错误的程序?

时间:2016-10-16 22:17:25

标签: c++ templates language-lawyer variadic-templates

不止一次(即使是在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],我们有:

  

如果出现以下情况,该程序格式错误,无需诊断:
  [...]
   - 可变参数模板的每个有效特化都需要一个空模板参数包,或者
  [...]

因此,包含上述片段的节目是否格式错误?

1 个答案:

答案 0 :(得分:8)

&#34;技巧&#34;导致程序错误,无需诊断。

标准在您引用的部分中明确说明了这一点。