首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

std:unique_ptr和shared_ptr的bool类型判断,是如何做到的

2012-06-07 
std::unique_ptr和shared_ptr的bool类型判断,是怎么做到的?例如像下面这样:C/C++ code#includememoryusi

std::unique_ptr和shared_ptr的bool类型判断,是怎么做到的?
例如像下面这样:

C/C++ code
#include<memory>using namespace std;int main(void){    unique_ptr<int> pi(new int);    if(pi){        printf("has data\n");    }    return 0;}

我用VC10调试跟进if(pi)这句话,发现是:
C/C++ code
    _OPERATOR_BOOL() const        {    // test for non-null pointer        return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);        }

我有3个问题:
(1)_OPERATOR_BOOL的定义到底是什么样? 我用F12跟进了一下发现似乎是int类型:
C/C++ code
#define _OPERATOR_BOOL    operator _STD _Bool_typetypedef int _Bool_struct::* _Bool_type;struct _Bool_struct    {    // define member just for its address    int _Member;    };

这个不是bool类型,对么?
(2)this->_Myptr != pointer()这里的_Myptr不就是现有的指针么,为什么不是和nullptr比,而是和pointer()比?
(3)#define _CONVERTIBLE_TO_TRUE(&_STD _Bool_struct::_Member) 这个好像又是一个int类型。
但是这个int类型只有定义没有赋值啊,没有看到哪里把这个int _Member设置成了1或者0.那么它的值是怎么来的呢?


[解决办法]
g++的实现
C/C++ code
explicit operator bool() const noexcept{ return get() == pointer() ? false : true; }
[解决办法]
一般是
operator void*
[解决办法]

VC 编译器, 很落后。
为什么还要用vc呢?
太执着了。


免费的 gcc ,
收费的 intel c++,

无论是性能,还是对语言标准的支持,都胜过 vc 编译器。

告别vc,才能使用真正的c++
[解决办法]
VC 2010,
对于C, 至今不支持C99
对于C++0x, 只支持极少的一部分
对于openMP,貌似还是2.0这种上古版本
对于CPU特性, 也只支持arch:sse2

告别VC吧,微软早就把重心转到 .net之类的去了
[解决办法]
(1) _OPERATOR_BOOL 被定义成了一个函数指针, 在 xstddef 里可以找到如下的定义:
typedef void (*_Bool_type)(const _Bool_struct&);

之所以定义一个这种指针主要是为了避免副作用, 比如你直接定义成 bool 或 int 或 void* 之类的话可能造成 int x = pi; 这种也通过编译了.
一个复杂的函数指针即可以用于做逻辑比较, 又能避免向常见类型的转换.
[解决办法]
(2) 和 pointer() 比较可以保证两个指针的类型是匹配的, nullptr 是一个什么类型? int? void* ?
[解决办法]
(3) _CONVERTIBLE_TO_TRUE 也是一个函数指针:

#define _CONVERTIBLE_TO_TRUE(&_STD _Bool_function)

inline void _Bool_function(const _Bool_struct&)
{// do nothing
}



你说的 #define _CONVERTIBLE_TO_TRUE(&_STD _Bool_struct::_Member) 是一个结构体的数据成员指针, 这是另外一个版本, 它对应着的 _Bool_type 也是一个结构体的数据成员指针:

typedef int _Bool_struct::* _Bool_type;

热点排行