gpt4 book ai didi

c++ - 什么时候应该使用 remove_reference 和 add_reference?

转载 作者:可可西里 更新时间:2023-11-01 18:11:09 27 4
gpt4 key购买 nike

我正在查看 [VC10 的] unique_ptr,它们做了一些我不明白的事情:

typedef typename tr1::remove_reference<_Dx>::type _Dx_noref;

_Dx_noref& get_deleter()
{ // return reference to deleter
return (_Mydel);
}

unique_ptr(pointer _Ptr,
typename _If<tr1::is_reference<_Dx>::value, _Dx,
const typename tr1::remove_reference<_Dx>::type&>::_Type _Dt)
: _Mybase(_Ptr, _Dt)
{ // construct with pointer and (maybe const) deleter&
}

typename tr1::add_reference<_Ty>::type operator*() const
{ // return reference to object
return (*this->_Myptr);
}

只写 _Dx& 或 _Ty& 不是一回事吗?

不过我确实理解他们为什么要在这里这样做:

unique_ptr(pointer _Ptr, typename tr1::remove_reference<_Dx>::type&& _Dt)
: _Mybase(_Ptr, _STD move(_Dt))
{ // construct by moving deleter
}

最佳答案

获取删除器

从返回类型中删除任何引用,然后添加一个引用。在符合标准的 C++11 中,将 & 添加到现有 &(或 &&)会生成 &。然而,在 C++03 中,这将形成对引用类型的引用,这是非法的。 MSVC 可能正在使用旧规则,或者该代码是在它使用时编写的,并且因为它无害而保留下来。

构造函数

这里他们移除了引用,添加了const,然后添加回引用,通过const引用传递。这是因为将 const 直接添加到引用类型不会没有! (§8.3.2/1)在 C++11 或 C++03 中,参数声明将有效但不会添加 const,如果引用未被删除和替换。

运算符*

这在本质上与 get_deleter 相同,但他们采用了不同的方式,并且 _Ty 不能作为引用类型开始。在我看来 _Ty& 就足够了,但这是他们的特权。

关于c++ - 什么时候应该使用 remove_reference 和 add_reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com