12

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

示例包括:

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
4

4 回答 4

13

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

它基本上是一种传达意图的方式。

于 2015-12-28T12:02:01.943 回答
9

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

例如,假设我想指定一个暴露被包装的指针包装类。我可以说,“类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不是规范一部分。但是拥有它可以让我用代码而不是文字来指定成员函数的语义。

于 2015-12-28T13:12:55.560 回答
5

n4296 17.5.2.3/2

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

streambuf* sb; // exposition only
于 2015-12-28T12:01:32.023 回答
4

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

看到这个答案。

于 2015-12-28T12:01:32.780 回答