【发布时间】:2013-02-22 00:45:01
【问题描述】:
C++11 标准的第 14.8.2/8 段规定了替换失败应或不应导致“硬”编译错误(从而导致编译失败)或“软”错误的条件这只会导致编译器从一组候选者中丢弃模板以进行重载解析(不会导致编译失败并启用众所周知的 SFINAE 习惯用法):
如果替换导致无效的类型或表达式,则类型推导失败。无效的类型或表达式 如果使用替换的参数编写,则格式错误。 [注意:访问检查完成为 替代过程的一部分。 --end note ] 只有在直接上下文中的无效类型和表达式 函数类型及其模板参数类型可能导致推演失败。 [...]
“即时上下文”这个词在整个 C++11 标准中只出现了 8 次,并且每次它们之后(或作为其一部分出现)以下(非-规范)文本:
[注:评价 替换的类型和表达式可能会导致副作用,例如类模板的实例化 特化和/或函数模板特化,隐式定义函数的生成等。 此类副作用不在“直接上下文”中,可能导致程序格式错误。—结束 注意]
注释对直接上下文的含义给出了一个(不是很慷慨的)提示,但至少对我来说,这通常不足以决定替换是否应该导致“硬”编译错误。
问题:
您能否提供解释、决策程序和/或一些具体示例,以帮助确定在函数的“即时上下文”中发生和不发生替换错误的情况类型及其模板参数类型?
【问题讨论】:
-
@JesseGood:是的,我读过,但它只是部分帮助,而且项目符号列表不是很清楚
标签: c++ templates c++11 language-lawyer sfinae