2015-02-03 2 views
1

Я использовал SymbolHound для поиска ресурсов в Интернете, сравнивая их, но ничего не мог найти.В чем разница между std :: ifstream :: in и std :: ios :: in? (очевидно, как флаг openmode для std :: ifstream в C++)

Ищем определение и определение std::ifstream::in в VS13 приводит меня к basic_ifstream. Ищу std::ios::in 's приносит меня к basic_ios.

Похоже, std::ios::in более широко используется.

Спасибо заранее,

Hans

+1

Насколько мне известно, 'std :: ios :: in' полезен только при использовании' std :: fstream' (который может выполнять как операции ввода, так и вывода), на 'std :: ifstream' /' std :: ofstream 'Эти флаги бесполезны. – Borgleader

+0

Все openmodes наследуются от базового класса 'std :: ios_base', поэтому полное имя' std :: ios_base :: in'. Они одинаковы при использовании из базового класса или производного класса. – 0x499602D2

+0

«избыточный» или «явный», если не * бесполезный *. –

ответ

4

Они оба одинаковы.

in является членом std::ios_base. Поэтому он также является членом ios, ifstream и всего остального, что происходит от ios_base.

Похоже, std::ios::in более широко используется.

Возможно, это самый короткий способ назвать его.

1

Если посмотреть на типы, std::ifstream является std::basic_ifstream<char> и std::ios является std::basic_ios<char>.

Иерархия есть:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT> 
> class basic_ifstream : public std::basic_istream<CharT, Traits> 

который:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT> 
> class basic_istream : virtual public std::basic_ios<CharT, Traits> 

std::ios является базовым классом std::ifstream, поэтому std::ifstream::in именно std::ios::in.