2013-02-07 57 views
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?

+0

該代碼中存在** no cast **。有一個**隱式轉換**。強制轉換是您在代碼中編寫的指示編譯器執行轉換的內容。 –

回答

5

它以explicit operator bool() const;的形式作爲成員轉換運算符實現。它是否返回true或false是在類本身的邏輯中實現的。例如,這類有一個返回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"); 
} 
+0

+1,因爲你說'顯式',另一個沒有。 C++ 03沒有'明確的'轉換,並且由於轉換運算符到'bool'導致了兩個惱人的問題。 「顯式」是解決這些問題的方法,所以它非常重要。 –

+1

+1因爲通過忽略C++ 03,你沒有陷入同樣的​​陷阱,當他們提供* unsafe *'bool'轉換時,感受到了其他的答案。 –

+1

順便說一句,對於所有這一切都是好的和純粹的愛,請'返回i == 42;';-) –

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中,允許將類轉換爲布爾類型,簡而言之,在邏輯上下文中,例如if(),while()等。如果沒有explicit,則可能會發生不好的事情,因爲存在隱式轉換數字類型爲bool。在C++ 03及更舊版本中,過載operator !()更安全,然後測試爲if (!!c)

1

A轉換運算符用於此功能:

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 +(0,如果x是零或1,如果x非空)