std::basic_ios
tem um construtor público :
explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);
Na IMO, a única razão para uma classe ter um construtor público é usar uma instância autônoma dessa classe em um programa. Se uma classe existe apenas para ter outras classes dela (como parece ser o caso basic_ios
), todos os construtores da classe devem ser protected
. Os construtores de std::ios_base
estão todos protegidos. Mas, por alguma razão, os projetistas do padrão tornaram esse construtor basic_ios
público.
basic_ios
é usado como uma classe base para vários tipos de fluxo e não posso imaginar um caso de uso em que você teria um que não fosse pelo menos um basic_istream
ou basic_ostream
. Existe um?
fonte
basic_ios
ctor que toma umabasic_streambuf*
conta é público desde antes de você poder fazerusing B::B;
. Eu espero que implementações antigas tenham apenas um proxy ctor:A(int x) : B(x) {}
- que funcione bem mesmo seB
o ctor estiverprotected
.O que eu não percebi foi isso
std::basic_istream
,std::basic_ostream
estd::basic_iostream
também tinha construtores públicos (cada um leva umstd::basic_streambuf*
).Isso permite um análogo de polimorfismo de programação genérica, na mesma linha que o idioma pimpl.
Ou seja, dessa forma, você pode criar um tipo de streambuf especializado e usá-lo em um
basic_
[io]stream
sem precisar criar classes de fluxo especializadas. (A funcionalidade é limitada: você não pode atribuir um novo buffer ao mesmo fluxo e deve acompanhar externamente a vida útil e a propriedade do buffer).Os especializados
basic_
[io]fstream
ebasic_
[io]stringstream
contêm uma instância completa do tipo de buffer associado. Isso significa que uma instância de um tipo de fluxo especializado funcionará apenas com seu buffer interno e não outro, nem mesmo um do mesmo tipo. O uso de umbasic_
[io] brutostream
é uma solução alternativa (desajeitada) para isso.fonte