【发布时间】:2020-07-23 02:03:09
【问题描述】:
一个模板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-deducible。 non-deduced context 只有一个定义,但我认为它们不是一回事。那么我如何理解non-deducible这个措辞呢?使用这种没有正式定义的措辞是否不清楚?
问题
-
Test<int>是一个无效的模板 ID,它违反了上面列表中的哪个项目符号? -
non-deducible指的是什么? -
不参与模板实参推演的模板形参是否可以调用
non-deducible?
【问题讨论】:
-
您的报价来自哪里?我很难找到它
-
@NathanOliver 修改了问题。
-
“可演绎”的英文定义是“能够被演绎”。前缀“non-”表示否定/相反。所以“non-deducible”表示“无法演绎”。“deuce”一词是动词,意思是“从假设或已知的事物中得出结论”或“to追踪”的推导。在引用的上下文中,最简单的意思是“无法推导”。
-
@Peter 你的意思是
non-deducible包含non-deduced context和一些无法派生的东西,对吧?而在我的示例中,U是non-deducible模板参数?
标签: c++ templates language-lawyer c++20