2

unique_ptr などの stl のクラスは、次のような例を時折表示します。

// 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';

null ポインターを追跡している場合、unique_ptr u1 が false に直接キャストされることを示しています。

この動作が他のカスタム クラスで使用されているのを見てきました。これはどのように管理され、このような bool への直接キャストが true を返すか false を返すかを決定するのはどの演算子ですか?

4

3 に答える 3

6

形式のメンバー変換演算子として実装されexplicit operator bool() const;ます。true を返すか false を返すかは、クラス自体のロジックに実装されています。たとえば、このクラスには bool 変換演算子があり、trueデータ メンバーに value がある場合は返さ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"); 
}
于 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;

上記の場合、+ (x が null の場合は 0、x が null でない場合は 1)yと等しくなります。7

于 2013-02-07T16:47:06.593 に答える