2013-02-07 38 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非空)