当前位置: 首页 > 知识库问答 >
问题:

为什么只有有效的空变量包的模板格式不佳?

姜志
2023-03-14

的理由是什么

template <typename ...Ts,
          typename A,
          typename B,
          std::enable_if_t<sizeof...(Ts) == 0, int> = 0> // Ill-formed NDR :-(
Pair<std::decay_t<A>, std::decay_t<B>> MakePair(A&&a, B&& b)
{
    return {a, b};
}

共有1个答案

范浩荡
2023-03-14

通常,实现可以早期诊断模板中的明显错误,因为无论如何都无法生成有效的实例化。但是包扩展有点独特,因为整个构造在实例化时可能会消失。因此,需要这一规则来禁止在包装膨胀的东西中出现各种明显的任性,并允许它们的早期诊断:

template<class...Ts>
union U : Ts... {}; // unions can't have base classes

template<class...Ts>
class C : Ts..., Ts... {}; // classes can't have duplicate direct base classes

template<class...Ts>
void f() {
    // sizeof(void) is invalid, but it can vanish
    int x[] = {(sizeof(void) + sizeof(Ts))..., 0};
}

这也在一定程度上帮助了编译器实现者,因为他们的模板的内部表示不需要支持这种无稽之谈。

 类似资料:
  • 问题内容: 我试图将值放入“标题”模板中,例如标题和导航链接,但无法访问我从包含的模板发送到主模板的变量。 渲染模板: index.html模板: header.html模板: 显然,它不会那样工作。 也许有一种方法可以解析/获取模板并将变量放入其中,而无需将整个头文件放入代码中?然后,我可以将该模板作为变量发送到我的主模板。但这似乎并不是最好的方法。 问题答案: 您可以在调用模板时将上下文传递给

  • 我在实验在不同的关键字和运算符周围是如何解释的,发现以下语法是完全合法的: 错误: 未捕获的引用错误:等待未定义 它似乎试图将解析为变量名。。?我期待着 或者是类似于 意外令牌等待 令我恐惧的是,你甚至可以给它分配一些东西: 如此明显错误的东西不应该导致语法错误吗,就像,,等一样?为什么允许这样做,以及第一个片段中到底发生了什么?

  • 本文向大家介绍React的严格模式有什么用处?相关面试题,主要包含被问及React的严格模式有什么用处?时的应答技巧和注意事项,需要的朋友参考一下 react的strictMode 是一个突出显示应用程序中潜在问题的工具,与Fragment一样,strictMode 不会渲染任何的可见UI,它为其后代元素触发额外的检查和警告。 注意:严格模式仅在开发模式下运行,它们不会影响生产构建 可以为程序的任

  • 所以我读了关于HashMap的文章。有人曾指出: 我不太明白...为什么?

  • 问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin

  • 问题内容: 6年前关闭。 有关匿名类的文档说明 匿名类无法在其封闭范围内访问未声明为final或有效地为final的局部变量。 我不明白变数为“有效的最终”是什么意思。有人可以提供一个示例来帮助我理解这意味着什么吗? 问题答案: 有效地最终意味着它在获得初始值之后永远不会改变。 一个简单的例子: 在这里,并没有声明为final,但是由于它从未更改,因此实际上被认为是 final 。 从Java 8