【问题标题】:What is the formal definition of the wording `non-deducible`“不可演绎”一词的正式定义是什么
【发布时间】:2020-07-23 02:03:09
【问题描述】:

temp.names#6

一个模板ID是有效的,如果

  • 参数的数量最多与参数的数量一样多,或者参数是模板参数包 ([temp.variadic]),
  • 对于每个没有默认模板参数的non-deducible非包参数都有一个参数,
  • 每个模板参数都匹配相应的模板参数 ([temp.arg]),
  • 将每个模板参数替换为以下模板参数(如果有)成功,并且
  • 如果模板 ID 不依赖,则满足下一段中指定的相关约束。

一个 simple-template-id 应该是有效的,除非它命名一个函数模板特化 ([temp.deduct])。

template<typename T, typename U>
struct Test{};
int main(){
  using type = Test<int>;
}

考虑上面的代码,在这种情况下,第二个模板参数是Unon-deducible吗?标准中似乎没有正式的术语来解释什么是non-deduciblenon-deduced context 只有一个定义,但我认为它们不是一回事。那么我如何理解non-deducible这个措辞呢?使用这种没有正式定义的措辞是否不清楚?

问题

  1. Test&lt;int&gt; 是一个无效的模板 ID,它违反了上面列表中的哪个项目符号?

  2. non-deducible 指的是什么?

  3. 不参与模板实参推演的模板形参是否可以调用non-deducible

【问题讨论】:

  • 您的报价来自哪里?我很难找到它
  • @NathanOliver 修改了问题。
  • “可演绎”的英文定义是“能够被演绎”。前缀“non-”表示否定/相反。所以“non-deducible”表示“无法演绎”。“deuce”一词是动词,意思是“从假设或已知的事物中得出结论”或“to追踪”的推导。在引用的上下文中,最简单的意思是“无法推导”。
  • @Peter 你的意思是non-deducible 包含non-deduced context 和一些无法派生的东西,对吧?而在我的示例中,Unon-deducible 模板参数?

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


【解决方案1】:

这只是英语。 “可推演”的意思是“能够推演”。 C++ 有一个well-defined process for deducing template arguments。如果一个论证是“可演绎的”,那么它就是这个演绎过程成功并因此“能够被演绎”的论证。

“不可演绎”仅表示“不可演绎”。因此“无法推断”。因此这个模板参数推导过程失败了。

所以它的意思是“每个非包参数都有一个参数,其参数不能通过模板推导过程推导出来”。没有什么不清楚的。

【讨论】:

  • 对这些参与模板实参推演的模板形参进行模板实参推演。模板参数U 不参与该过程。那么它是不可演绎的吗?
  • 这里的重点是,Test&lt;int&gt; 不是进行模板参数推导的必要条件。这只是为模板显式指定模板参数的一种情况。即使对这样的template-id进行模板实参推导,但是第二个模板实参U不参与这样的过程。 In most cases, the types, templates, and non-type values that are used to compose P participate in template argument deduction.
  • 总之,你觉得不参与模板实参推演的模板形参可能叫non-deducible吗?
  • @jackX 这写在答案中。
  • @Oliv 看来初级类模板的所有模板参数都是non-deduciblededucible 可以是这些出现在函数模板中的类型还是那些将被重写为函数的类型模板(类偏特化的模板参数)。
猜你喜欢
  • 2019-11-04
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2021-09-12
  • 2019-12-15
相关资源
最近更新 更多