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

sky*_*ack 7 c++ templates language-lawyer variadic-templates

不止一次(甚至在SO上)我见过这样的代码:

template<typename U, typename... G, typename T = Traits<U>>
struct {
    static_assert(sizeof...(G) == 0, "!");
    // ...
};
Run Code Online (Sandbox Code Playgroud)

或这个:

template<typename T, typename... G, typename = std::enable_if_t<condition<T>>
void func(T &&t) {
    static_assert(sizeof...(G) == 0, "!");
    // ....
}
Run Code Online (Sandbox Code Playgroud)

目的是避免用户做这样的事情来打破游戏规则:

template<typename T, typename = std::enable_if_t<std::is_same<T, int>>
void func(T &&t) {
    // ....
}

// ...

func<int&, void>(my_int);
Run Code Online (Sandbox Code Playgroud)

使用guard参数包时,无法覆盖默认值.
另一方面,对尺寸的检查避免了无用参数的专业化污染.

无论如何,由于[temp.res/8],我们有:

该程序格式错误,无需诊断,如果:
[...]
- 可变参数模板的每个有效专业化都需要一个空模板参数包,或
[...]

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

Yak*_*ont 8

"技巧"导致程序错误,无需诊断.

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