【问题标题】:Are checked guard parameter packs cause of ill-formed programs?检查保护参数包是否会导致程序格式错误?
【发布时间】:2016-10-16 22:17:25
【问题描述】:

不止一次(甚至在 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);

使用保护参数包,不能覆盖默认值。
另一方面,对大小的检查避免了无用参数对专业的污染。

无论如何,因为[temp.res/8],我们有这个:

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

因此,包含上述 sn-ps 的程序是否格式错误?

【问题讨论】:

  • 是的。这就是为什么有经验的 TMP'lers 会使用一个类模板,该模板同时采用包的大小和T 来确定@​​987654326@ 条件。 (虽然我不知道有经验的 TMP'lers 是否真的会首先采用这种方法。)
  • 一开始我看不到使用参数包的意义,您可以使用template &lt;typename T, std::enable_if_t&lt;condition&lt;T&gt;, int&gt; = 0&gt;,用户无法绕过,也可以在开关SFINAE中使用.
  • @Corristo,从来没有这样的代码。好技巧!
  • @Corristo 我怀疑你没有明白问题的重点。这与如何编写 sfinae 表达式无关。
  • @skypack 是的,我知道,但我想强调的是,&lt;typename T, std::enable_if_t&lt;condition&lt;T&gt;, int&gt; = 0&gt; 模板在各方面都优于参数包。

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


【解决方案1】:

“技巧”导致程序格式错误,无需诊断。

标准在您引用的部分中明确说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多