UnspecifiedBoolType的类型?关于typedef,成员函数指针和转换运算符

陈昱安*_*陈昱安 2 c++ typedef

我想了解下面的代码.实际的类型是UnspecifiedBoolType什么?

我糊涂了.有谁可以向我解释一下?提前致谢!

template <typename T>
class MyOptional
{
public:    
    MyOptional() : valueIsSet(false) {}
    MyOptional(const T& value) : valueIsSet(true), value(value) {}

    // Conversion to bool. This is a variant of the "safe bool idiom".
    typedef T MyOptional<T>::*UnspecifiedBoolType;
    inline operator UnspecifiedBoolType() const;

    ...

private:
    bool valueIsSet;
    T value;
};

...

template<typename T>
MyOptional<T>::operator MyOptional<T>::UnspecifiedBoolType() const
{
    return valueIsSet ? &MyOptional<T>::value : 0;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 5

正如你的代码中的评论所说,这是" 安全的bool成语"."未指定的bool类型"是一种可以在这样的条件表达式中使用的类型:

MyOptional<int> myop;
// ...
if (myop) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

人们在C++中这样做的原因是为了防止bool通过类的转换运算符将意外转换为其他类型.例如,如果没有安全的bool习语,你可以这样做:

MyOptional<int> myop;
// ...
int bad = myop; // bad is now zero or one, not the "value" of myop
Run Code Online (Sandbox Code Playgroud)

最后,请注意,在C++ 11中,我们不再需要像这样的模糊代码,因为现在我们有一个语言功能,可以让我们写这个:

explicit operator bool();
Run Code Online (Sandbox Code Playgroud)