首页 >后端开发 >C++ >C 11 SFINAE 中的'直接上下文”由什么构成?

C 11 SFINAE 中的'直接上下文”由什么构成?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-10 18:12:11809浏览

What Constitutes the

C 11 SFINAE 中的“立即上下文”到底是什么?

“立即上下文”的概念在 C 11 的替换中至关重要失败不是错误 (SFINAE) 习语。根据 C 11 标准,只有函数类型及其模板参数类型的“直接上下文中”的无效类型和表达式才会导致推导失败。

初步理解

标准在注释中提供了有限的提示:“替换类型和表达式的计算可能会导致副作用,例如类模板特化、函数模板特化、隐式函数生成等”这些副作用不被视为“直接上下文”的一部分。

决策程序

要确定“直接上下文”中是否发生替换错误,请遵循以下步骤程序:

  1. 确定必要的模板和函数:考虑参数替换所需的所有模板和隐式定义函数。
  2. 预实例化步骤:想象一下在替换之前生成这些模板和函数。
  3. 直接错误: 如果在此预实例化步骤中发生任何错误,它们不会出现在直接上下文中并导致硬编译
  4. 推演失败:如果预实例化成功,则后续替换过程中出现的错误都不是错误,而是推演失败。

具体示例

  • 示例 1 (硬错误):
template<typename T>
void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
  • 示例 2(推导失败):
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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn