- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在查看 [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/
根据文档(https://en.cppreference.com/w/cpp/utility/move),std::move有两种构造函数,在下面发布。 这些构造函数之间有什么区别? 最让我困惑的是,
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 4
我正在学习类型特征和类型转换(修改?),所以我遇到了 std::remove_reference .我试着这样实现它: template struct remove_reference { type
根据 this link , std::forward 不允许模板参数推导,而 std::remove_reference 正在帮助我们实现这一目标。但是,使用 remove_reference 如何
是否有 C++ 的 std::remove_reference 的等价物?在 C# 中? 我有一个 String和 String& ,而在我现在的项目中,这些应该被认为是等效的。 在 C++ 中,我会
remove_reference 定义如下: template struct remove_reference {typedef T type;}; template struct remo
我正在追踪一个我无法弄清楚的 C++ 编译器错误。我已将其简化为以下代码: #include #include template inline const T bar( T in ) {
我写了一个返回对象右值引用的简单函数。但它不能正常工作。但是如果我使用 std::move 它的工作,我看到唯一的区别是 remove_reference 还是什么?或者我对右值的转换是错误的? te
所以,我正在做功课,作为代码的一部分,我需要创建一个具有 3 个参数的函数,前两个是指针或迭代器,它们构成特定的元素 block ,第三个参数是具有一个参数的函数,并且该参数与两个指针或迭代器之间的
让我深入了解 C++14 通用 lambda: #include // g++ -std=c++14 template T incr(T v) { return v + 1; } int m
我看到了 std::remove_reference 的可能实现如下 template struct remove_reference {typedef T type;}; template
我正在查看 [VC10 的] unique_ptr,它们做了一些我不明白的事情: typedef typename tr1::remove_reference::type _Dx_noref; _Dx
向上迁移这个迁移 def change remove_reference :order_items, :order, foreign_key: true end 或向下迁移此迁移 def ch
我尝试实现 std::move , 使用 std::remove_reference ,但是没有它似乎也能工作。请给我一个我的实现失败的例子,其中std::remove_reference是必要的。
根据 http://en.cppreference.com/w/cpp/utility/move std::move声明如下: template std::remove_reference::typ
在用C++做模板元编程的时候,经常遇到类似下面的情况: template S make_wrapper(T&& t) { return S(std::forward(t)); } 我知道我应该在返回
我正在试验 std::remove_reference。例如,我可以将一个元素类型提取为一个数组,但如何让 remove_reference 与 STL 容器一起使用?例如,我想使用下面的 remov
如果我想提取 const 引用的类型(如 const double& 中的 double),我必须使用: typename std::remove_cv::type>::type 或 typename
我会更详细地描述我的情况。我正在构建一个车牌识别系统,使用 C++、OpenCV、Tesserect,但是当我编译代码时,它返回给我一堆错误的模糊引用,所以我检查了我的代码的所有行。我在这个小组中搜索
在下面的代码中,我使用了 std::remove_const 和 std::remove_reference 但在两种情况下以不同的顺序给出了不同的结果: #include #include #i
我是一名优秀的程序员,十分优秀!