- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据 http://en.cppreference.com/w/cpp/utility/move
std::move
声明如下:
template <typename T>
std::remove_reference<T>::type&& move(T&& t);
据我了解,当代码被模板化时,扣除T
在 typename T
丢失有关引用的信息,因此如下:
template <typename T>
void someFunction(T&& value);
像这样使用时:
int five=5;
someFunction(five);
然后
value
类型为 int&
T
是int
或
const float value = 5.25;
someFunction(value);
然后
value
类型为 const float&
T
是const float
.如果是这样,那么在 move 声明中就没有必要将返回类型声明为: std::remove_reference<T>::type&&
, 因为 T 已经不是引用了。
此外,如果std::move
将引用作为参数(实际上是左值引用),然后返回 static_cast<T&&>(t)
在 std::move
事实上,由于引用折叠将返回左值引用或右值引用,因此它的行为更像 std::forward
。不动。那么什么是技巧,使它正常工作,我不明白?
最佳答案
您的示例不正确:
int five=5;
someFunction(five);
在这种情况下,T
被推断为 int&
,而不是 int
。第二个例子也是如此; T
推导为 const int&
。
因此,仅返回 T&&
意味着 T&& &
,由于引用折叠规则,它是 T&
。
这就是为什么需要 std::remove_reference
的原因,以确保该类型上没有引用以防止发生引用折叠。
关于c++ - 为什么 std::move 使用 std::remove_reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35266472/
根据文档(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
我是一名优秀的程序员,十分优秀!