2

stl 中的类,例如 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 的方法是返回 true 还是 false?

4

3 回答 3

6

它被实现为表单的成员转换运算符explicit operator bool() const;。返回true还是false是在类本身的逻辑中实现的。例如,这个类有一个 bool 转换运算符,true如果它的数据成员有 value 则返回42false否则:

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"); 
}
于 2013-02-07T16:46:02.727 回答
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).

于 2013-02-07T16:45:45.723 回答
1

转换运算符用于此功能:

operator bool(){ return false; }

在 C++11 中,您也可以制作它们explicit

explicit operator bool(){ return true; }

隐式转换运算符是一项容易出错的工作。考虑如果unique_ptr有一个隐式转换运算符来布尔,你可以做一些无意义的事情,比如......

std::unique_ptr<Thing> x;
int y = 7 + x;

在上述情况下y等于7+(如果 x 为空则为 0,如果 x 为非空则为 1)

于 2013-02-07T16:47:06.593 回答