C++ 参考手册

位置:首页 > C++ 参考手册 >迭代器库 > std::indirectly_writable

  concept indirectly_writable =
    requires(Out&& o, T&& t) {
      *o = std::forward<T>(t);
      *std::forward<Out>(o) = std::forward<T>(t);
      const_cast<const std::iter_reference_t<Out>&&>(*o) = std::forward<T>(t);
      const_cast<const std::iter_reference_t<Out>&&>(*std::forward<Out>(o)) =
        std::forward<T>(t);
    };

    // 上述四个表达式都不要求保持相等性
(C++20 起)

概念 indirectly_writable<Out, T> 指定写入类型和值类别为 T 所编码的值到迭代器 Out 所引用对象的要求。

语义要求

e 为满足 decltype((e))T 的表达式,而 oOut 类型的可解引用对象,则 indirectly_writable<Out, T> 仅若符合下列条件才被实现:

  • std::indirectly_readable<Out> 得到实现且 std::iter_value_t<Out>std::decay_t<T> 为同一类型,则在任何上述赋值后 *o 等于 e 在赋值前的值。

不要求 o 在求值任何上述赋值表达式后可解引用。若 e 为亡值,则其代表的对象的结果状态合法但未指定。

相等性保持

若表达式对给定的相等输入产生相等输出,则它保持相等性

  • 表达式的输入由其操作数组成。
  • 表达式的输出由其结果和表达式所修改的所有操作数(若存在)组成。

在标准概念的规范中,操作数定义为仅包含下列内容的最大子表达式:

每个操作数的 cv 限定与值类别,是通过假设每个模板类型形参代表一个 cv 无限定的非数组对象类型确定的。

进一步要求每个要求保持相等性的表达式都稳定:这种表达式带相同输入对象的二次求值必须拥有相等的输出,而无任何对这些输入对象的显式中间修改。

注解

operator* 仅有的合法用法是在赋值表达式左侧。通过相同的间接可写类型值的赋值只可以发生一次。

const_cast 的要求表达式阻止有纯右值 reference 类型的 indirectly_readable 对象意外满足 indirectly_writable 的语法要求,同时容许代理引用继续工作,只要其常性是浅的。见范围 TS 问题 381