在 C++ 中使用 ios_base 时范围解析运算符的目的是什么

What's the purpose of scope resolution operator when using ios_base in C++

以下示例来自 Bjarne 的书 - 《C++编程与原理》,例子:

fstream fs;
fs.open("foo",ios_base::in);
fs.close();
fs.open("foo",ios_base::out);

我知道我对名称空间使用范围解析运算符,当使用枚举时,当 class 中有 class 时,但我不明白的是,目的是什么使用 ios_base::inios_base::out?

时的范围解析运算符

What is the purpose of the scope resolution operator while using the ios_base::in and ios_base::out?

目的是,嗯,解析范围

指定此上下文中的符号inout[std::]ios_base范围内。

否则,您的编译器根本不知道您在谈论 inout

具体来说,在这种情况下,它们是 class std::ios_base.

的静态成员

查看范围解析运算符的一般方法是说您使用它来解析可以静态解析的内容。这包括您在问题中列出的内容,但也应包括其他内容。

最值得注意的是,您的列表不包含 class 的静态成员。这正是 inout 的含义 - 它们是 static data members,因此您需要范围解析运算符来解析它们。适用性不仅限于静态数据成员:静态成员函数也使用范围解析运算符进行解析。

ios_base 指的是 class,特别是 std::ios_base(参见标准中的 C++11 27.5.3 [ios.base])。 ios_base::in 被定义为 static constexpr 类型的 fmtflags 变量。

因此,ios_base::inios_base::out 和朋友只是命名常量变量。

例如:

class ios_base
{
    public:
    static constexpr fmtflags out = 1234 /* (or any other constant) */;
};

int main()
{
    // Access static member `out` of class `ios_base`
    printf("%d", ios_base::out);
}