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
是什么样子,以说明标准委员会想要什么样的实现。 这基本上是一种传达意图的方式。
例如,假设我想指定一个公开包装的指针包装类。我可以说,“类 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
规范的一部分。但有了它,我就可以用代码而不是文字来指定成员函数的语义。
n4296 17.5.2.3/2
streambuf* sb; // exposition only
它表示实现特定项目的多种可能方法之一,但不一定是最好的方法。