是否隐式指定了`ios_base::app`保证`ios_base::out`

Does `ios_base::app` guarantee `ios_base::out` is implicitly specified?

本文关键字:base ios app 保证 out 是否      更新时间:2023-10-16

A:

std::ofstream("test.txt", std::ios_base::app);

B:

std::ofstream("test.txt", std::ios_base::app|std::ios_base::out);

C++标准是否保证A与B相同?

是的,根据[ofstream.cons]

explicit basic_ofstream(const char* s,
    ios_base::openmode mode = ios_base::out);

效果:构造一个类为basic_ofstream的对象,用basic_ostream(&sb)初始化基类并用basic_filebuf<charT,traits>())初始化sb,然后调用rdbuf()->open(s, mode|ios_base::out)。如果该函数返回一个空指针calls setstate(failbit)

注意,不是app有这个保证,而是对底层streambuf本身的调用;传递给构造函数/open的任何标志都始终使用out(对于ifstream,也使用in(。