C 11 SFINAE 中的“立即上下文”到底是什么?
“立即上下文”的概念在 C 11 的替换中至关重要失败不是错误 (SFINAE) 习语。根据 C 11 标准,只有函数类型及其模板参数类型的“直接上下文中”的无效类型和表达式才会导致推导失败。
初步理解
标准在注释中提供了有限的提示:“替换类型和表达式的计算可能会导致副作用,例如类模板特化、函数模板特化、隐式函数生成等”这些副作用不被视为“直接上下文”的一部分。
决策程序
要确定“直接上下文”中是否发生替换错误,请遵循以下步骤程序:
具体示例
template<typename T> void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
template<typename T> void func(typename T::type* arg);
template<> struct A<char> {};
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.
结论
“直接上下文”指的是可以被除了必要的预实例化步骤之外,不需要额外的模板或函数生成即可解决。预实例化阶段发生错误会导致硬编译错误,而后续替换阶段发生错误会导致推演失败。
以上是C 11 SFINAE 中的'直接上下文”由什么构成?的详细内容。更多信息请关注PHP中文网其他相关文章!