类,例如unique_ptr,偶尔会显示如下例子:
// unique_ptr constructor example
#include <iostream>
#include <memory>
int main () {
std::default_delete<int> d;
std::unique_ptr<int> u1;
std::unique_ptr<int> u2 (nullptr);
std::unique_ptr<int> u3 (new int);
std::unique_ptr<int> u4 (new int, d);
std::unique_ptr<int> u5 (new int, std::default_delete<int>());
std::unique_ptr<int> u6 (std::move(u5));
std::unique_ptr<void> u7 (std::move(u6));
std::unique_ptr<int> u8 (std::auto_ptr<int>(new int));
std::cout << "u1: " << (u1?"not null":"null") << '\n';
std::cout << "u2: " << (u2?"not null":"null") << '\n';
std::cout << "u3: " << (u3?"not null":"null") << '\n';
std::cout << "u4: " << (u4?"not null":"null") << '\n';
std::cout << "u5: " << (u5?"not null":"null") << '\n';
std::cout << "u6: " << (u6?"not null":"null") << '\n';
std::cout << "u7: " << (u7?"not null":"null") << '\n';
std::cout << "u8: " << (u8?"not null":"null") << '\n';
*emphasized text* return 0;
}
该行:
std::cout << "u1: " << (u1?"not null":"null") << '\n';
显示unique_ptr u1在跟踪空指针时直接转换为false。
我在其他自定义类中看到过这种行为。如何管理以及哪个运算符决定直接强制转换为bool(例如this)是返回true还是false?
答案 0 :(得分:6)
它是作为explicit operator bool() const;
形式的成员转换运算符实现的。它是返回true还是false是在类本身的逻辑中实现的。例如,此类有一个bool转换运算符,如果它的数据成员的值为true
则返回42
,否则返回false
:
struct Foo
{
explicit operator bool() const { return n==42; }
int n;
};
#include <iostream>
int main()
{
Foo f0{12};
Foo f1{42};
std::cout << (f0 ? "true\n" : "false\n");
std::cout << (f1 ? "true\n" : "false\n");
}
答案 1 :(得分:2)
operator bool();
键入bool
是标准的强制转换运算符。
以下是如何使用它的示例:
class Checked
{
bool state;
public:
Checked(bool _state) : state(_state) { }
explicit operator bool() const {
return state;
}
};
Checked c (true);
if (c)
cout << "true";
请注意explicit
关键字。它出现在C ++ 11中,允许安全将类转换为bool,简而言之就是在if()
,while()
等逻辑上下文中发生。 explicit
,可能会发生不好的事情,因为bool
隐式转换为数字类型。在C ++ 03及更早版本中,重载operator ! ()
会更安全,然后将其作为if (!!c)
进行测试。
答案 2 :(得分:1)
转换运算符用于此功能:
operator bool(){ return false; }
在C ++ 11中,你也可以将它们explicit
explicit operator bool(){ return true; }
隐式转换运算符是一种容易出错的尝试。考虑unique_ptr
是否有一个隐含的转换运算符来bool,你可以做一些无意义的事情,比如......
std::unique_ptr<Thing> x;
int y = 7 + x;
在上述情况下,y
将等于7
+(如果x为空则为0,如果x为非空,则为1)