为什么 C++ 11 将 operator bool 添加到 ios 类
Why C++ 11 added operator bool to the ios classes
在C++ 98中,ios中有一个public函数classes定义为
operator void*() const;
在C++11中对class添加了一个operator bool
,即
explicit operator bool() const;
通过阅读 reference,我不清楚为什么需要 operator bool
。
谁能举个例子,其中 operator void*
导致问题,而 operator bool
工作正常?
在 C++98 中没有 explicit
转换运算符,所以如果你有一个 operator bool
这意味着该对象可以用作 bool
或任何可以是从 bool
转换(例如 int
)这意味着您可能会意外地以您不希望或不想要的方式使用您的对象(例如 obj + 2
)。某些对象提供了对 void*
的转换,这意味着该对象可以在 if
语句(非空)中进行测试,但不能传递给期望 int
等的函数
随着 explicit
转换运算符的引入,这不再需要,为了拥有一个 可测试的 对象,使用 explicit operator bool
比operator void*
。
它归结为便利性,甚至 classes.
库中的一些 "sponsorship" 新功能
void*
转换很危险,因为它可能适用于任何地方。好吧,在实践中,因为它是一个指针,你可能会在数字表达式(主要是在条件)中使用它,它是安全的,但如果有人试图在其他任何地方使用它,就有可能出现麻烦。作为一名 class 设计师,您希望尽可能避免它。
在C++11中,当你定义explicit
运算符时,你应该记住,对于我们来说,explicit
部分在条件中被忽略。因此,您大大减少了不需要的转换和不需要的结果的可能性。在条件之外,不会有任何转换,因此编译时错误会警告您可能滥用 class(您仍然可以通过适当的强制转换允许)。
A void*
仍然不能完美替代隐式转换为 bool
的缺点。它遇到与转换为 bool
相同的问题,主要是一些运算符允许 类 在应用操作之前转换为指针。
一个很好的例子是,使用 void*
运算符,你可以做类似 delete std::cin;
的事情,它可能会在没有警告的情况下构建,只会在 运行- 处导致失败时间。这可能不是 可能 编写的代码,但如果可能的话,仍然希望避免它。
在C++ 98中,ios中有一个public函数classes定义为
operator void*() const;
在C++11中对class添加了一个operator bool
,即
explicit operator bool() const;
通过阅读 reference,我不清楚为什么需要 operator bool
。
谁能举个例子,其中 operator void*
导致问题,而 operator bool
工作正常?
在 C++98 中没有 explicit
转换运算符,所以如果你有一个 operator bool
这意味着该对象可以用作 bool
或任何可以是从 bool
转换(例如 int
)这意味着您可能会意外地以您不希望或不想要的方式使用您的对象(例如 obj + 2
)。某些对象提供了对 void*
的转换,这意味着该对象可以在 if
语句(非空)中进行测试,但不能传递给期望 int
等的函数
随着 explicit
转换运算符的引入,这不再需要,为了拥有一个 可测试的 对象,使用 explicit operator bool
比operator void*
。
它归结为便利性,甚至 classes.
库中的一些 "sponsorship" 新功能void*
转换很危险,因为它可能适用于任何地方。好吧,在实践中,因为它是一个指针,你可能会在数字表达式(主要是在条件)中使用它,它是安全的,但如果有人试图在其他任何地方使用它,就有可能出现麻烦。作为一名 class 设计师,您希望尽可能避免它。
在C++11中,当你定义explicit
运算符时,你应该记住,对于我们来说,explicit
部分在条件中被忽略。因此,您大大减少了不需要的转换和不需要的结果的可能性。在条件之外,不会有任何转换,因此编译时错误会警告您可能滥用 class(您仍然可以通过适当的强制转换允许)。
A void*
仍然不能完美替代隐式转换为 bool
的缺点。它遇到与转换为 bool
相同的问题,主要是一些运算符允许 类 在应用操作之前转换为指针。
一个很好的例子是,使用 void*
运算符,你可以做类似 delete std::cin;
的事情,它可能会在没有警告的情况下构建,只会在 运行- 处导致失败时间。这可能不是 可能 编写的代码,但如果可能的话,仍然希望避免它。