C ++ 11标准的14.8.2 / 8段规定了替换失败应或不应该导致“硬”编译错误(从而导致编译失败)或“软”错误的条件,使编译器从一组候选集中丢弃模板以进行重载解决(而不会使编译失败并启用众所周知的SFINAE惯用语):
如果替换导致无效的类型或表达式,则类型推导将失败。无效的类型或表达式是使用替换参数编写的格式或表达式。[注意:访问检查是替代过程的一部分。— —注释[end note] 只有在函数类型及其模板参数类型的直接上下文中无效的类型和表达式才可能导致推论失败。[...]
在整个C ++ 11标准中,“ 即时上下文 ”一词仅出现8次,并且每次其后跟随(或作为其一部分)以下(非规范)文本的实例:
[注:对替换类型和表达式的求值可能会导致副作用,例如实例化类模板专业化和/或函数模板专业化,生成隐式定义的函数等。此类副作用不在“立即”中。上下文”,并可能导致程序格式错误。—尾注]
该注释对即时上下文的含义给出了(不是很慷慨的)提示,但至少对我而言,这通常不足以确定独占是否会导致“硬”编译错误。
题:
您能否提供说明,决策过程和/或一些具体示例,以帮助弄清楚在什么情况下函数类型及其模板参数类型的“ 立即上下文 ”中发生或不发生替代错误?
白板的微信
哈士奇WWW
相关分类