博览会只在C++标准中?

Vin*_*ent 8 c++ standards c++-standard-library c++11 reverse-iterator

这是什么的论述仅正是在C++标准意味着什么?这是否意味着标记的私人/受保护成员只需要按标准存在,或者它们只是实施的"建议",并不是必需的?

例子包括:

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
Run Code Online (Sandbox Code Playgroud)

jal*_*alf 12

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

它基本上是一种沟通意图的方式.


Ker*_* SB 7

仅博览会成员用于简化行为规范。一旦引入了仅博览会成员并给出了名称,就可以根据该类指定类的语义,但是可以理解,所指定的只是该类的语义,该成员本身不属于该类其中。任何符合要求的实现都必须具有与引用该成员的规范中描述的方式相同的行为。

例如,假设我要指定一个暴露包装的指针包装器类。我可以说:“类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; }          // /
};
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢将它们视为该语言的“ C ++抽象机”的库。 (2认同)

For*_*veR 5

n4296 17.5.2.3/2

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

streambuf* sb; // exposition only
Run Code Online (Sandbox Code Playgroud)