【问题标题】:Exposition only in the C++ standard?仅在 C++ 标准中进行说明?
【发布时间】:2016-04-02 06:40:38
【问题描述】:

exposition only 在 C++ 标准中的确切含义是什么?这是否意味着标记为 exposition only 的私有/受保护成员必须按照标准存在,或者它们只是实施的“建议”,根本不需要?

示例包括:

std::error_code::val_
std::wstring_convert::byte_err_string
std::array::elems
std::move_iterator::current
std::reverse_iterator::current
std::ostream_iterator::delim
// And a lot of others

【问题讨论】:

标签: c++ c++11 standards c++-standard-library reverse-iterator


【解决方案1】:

这意味着它们不是标准所要求的,但它们只是说明类的内部结构可能是什么样的,以了解标准委员会所考虑的实现类型.

这基本上是一种交流意图的方式。

【讨论】:

    【解决方案2】:

    仅展示成员用于简化行为规范。一旦引入了仅用于说明的成员并为其命名,就可以根据它指定类的语义,但可以理解的是,所指定的只是类的语义,成员本身不是其中的一部分。任何符合要求的实现只需与引用该成员的规范中描述的方式相同。

    例如,假设我想指定一个指针包装类来公开被包装者。我可以说,“Foo 类拥有对T 类型对象的引用,该对象被赋予了它的构造函数,而Foo::get 公开了该对象。”这是非常冗长和不精确的。或者,我可以用一个仅展示的成员来指定它:

    Foo 类包含对 T 类型对象的引用。

    class Foo {
      const T* ptr;   // exposition-only
    
    public:
      // Constructor                                 // \
      Foo(const T& t) : ptr(std::addressof(t)) {}    //  |
                                                     //   >  real specification
      // Accessor                                    //  |
      const T& get() const { return *ptr; }          // /
    };
    

    当我被允许引用某些特定的实现时,各个成员函数的规范变得更加容易,但可以理解的是,您可以以任何您喜欢的方式实现它(例如,使用基类或私有嵌套类型),并且成员 Foo::ptr 不是规范的一部分。但是拥有它可以让我用代码而不是文字来指定成员函数的语义。

    【讨论】:

    • 我喜欢将它们视为语言的“C++ 抽象机”的库等价物。
    【解决方案3】:

    它表示实现特定项目的多种可能方式之一,但不一定是最佳方式。

    请参阅this 答案。

    【讨论】:

      【解决方案4】:

      n4296 17.5.2.3/2

      某些类的对象有时是外部需要的 他们的类的规范来存储数据,显然在成员中 对象。为了说明起见,一些子条款提供 有代表性的声明和语义要求,用于私有 满足外部规范的类的成员对象 类。此类成员对象的声明和定义 的相关成员类型后跟以注释结尾 仅用于说明,如:

      streambuf* sb; // exposition only
      

      【讨论】:

        猜你喜欢
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        相关资源
        最近更新 更多