为什么`std :: basic_ios`具有公共构造函数?

Spe*_*cer 15 c++ stream design-rationale language-lawyer

std::basic_ios有一个公共的构造函数

explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
Run Code Online (Sandbox Code Playgroud)

IMO,一个类具有公共构造函数的唯一原因是在程序中使用该类的独立实例。如果仅存在一个类以使其他类从其派生(如的情况basic_ios),则该类的所有构造函数都应为protected。的构造函数std::ios_base均受保护。但是,由于某种原因,该标准的设计者将这一构造函数basic_ios公开了。

basic_ios用作几种流类型的基类,并且我不能设想用例中至少有一个不是a basic_istream或的用例basic_ostream。有一个吗?

Oli*_*liv 1

类拥有公共构造函数的另一个原因是可以使用此构造函数签名来构造派生对象:

struct B{
  B(int);
  protected:
  ~B();
  };

 struct A:B{
    private://no effect.
    using B::B;

    public:
    A(void*);
    };

 A a(10);
Run Code Online (Sandbox Code Playgroud)

构造函数在基类中必须是公共的,因为基构造函数的 using 声明不会更改继承的构造函数的可访问性。

  • 似乎是合理的,除了 afaik 之外,在你可以执行 `using B::B;` 之前,采用 `basic_streambuf*` 的 `basic_ios` ctor 就已经是公开的了。我希望旧的实现只有一个代理 ctor:“A(int x) : B(x) {}” - 即使“B”的 ctor 是“protected”,它也能正常工作。 (2认同)