rvalue-reference 相关问题

右值引用是C ++ 11中的一种新语言特性,表示对右值的引用。与参考折叠一起,它们用于实现和启用移动语义和完美转发。

如何使转发引用参数仅绑定到右值引用?

我正在编写一个网络库,并大量使用移动语义来处理文件描述符的所有权。我的一个班级希望接收其他类型的文件描述符包装器并取得所有权......

回答 5 投票 0

为什么 std::forward 在传输左值时返回右值? [重复]

据说std::forward()完美地将左值转发到左值,将右值转发到右值。但下面的代码似乎显示出不同的结论? 当我运行下面的代码时 #包括 据说 std::forward() 完美将左值转发到左值,将右值转发到右值。但下面的代码似乎显示出不同的结论? 当我运行下面的代码时 #include <iostream> class A { public: int x; A() {x = 0;} explicit A(int x) : x(x) {} A& operator= (A&& other) { std::cout << " && =" << std::endl; x = other.x; } A& operator= (const A& other) { std::cout << " & =" << std::endl; x = other.x; } }; int main() { A p1(1), p2, p3; p2 = p1; p3 = std::forward<A>(p1); return 0; } 结果是: & = && = 看起来 std::forward<A>(p1) 将 p1 作为右值转发。 std::forward()的源代码是: /** * @brief Forward an lvalue. * @return The parameter cast to the specified type. * * This function is used to implement "perfect forwarding". */ template<typename _Tp> constexpr _Tp&& forward(typename std::remove_reference<_Tp>::type& __t) noexcept { return static_cast<_Tp&&>(__t); } /** * @brief Forward an rvalue. * @return The parameter cast to the specified type. * * This function is used to implement "perfect forwarding". */ template<typename _Tp> constexpr _Tp&& forward(typename std::remove_reference<_Tp>::type&& __t) noexcept { static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument" " substituting _Tp is an lvalue reference type"); return static_cast<_Tp&&>(__t); } gdb 显示,当运行 p3 = std::forward<A>(p1); 时,它会进入第一个函数 forward(typename std::remove_reference<_Tp>::type& __t) noexcept 并返回类型为 A && 的值 (gdb) p __t $2 = (std::remove_reference<A>::type &) @0x7fffffffd1cc: { x = 1 } (gdb) p static_cast<_Tp&&>(__t) $3 = (A &&) @0x7fffffffd1cc: { x = 1 } 我完全困惑了。您能解释一下调用 std::forward() 时发生了什么吗?如果 std::forward<A>(p1) 将 p1 作为右值转发,那么 std::forward 和 std::move 有什么区别? 如果 std::forward<A>(p1) 将 p1 作为右值转发,那么 std::forward 和 std::move 有什么区别? 区别在于 std::forward<A&>(p1) 返回左值,而 std::move 则不返回。 你误用了std::forward。传递常量模板类型参数是没有意义的。当函数具有从函数参数推导出类型的转发引用时,它们非常有用:示例: template<class T> void foo(T&& ref) { T t = std::forward<T>(ref); // copy or move ... foo(p1); // T is deduced as A&

回答 1 投票 0

转发引用不会推导出右值引用

首先,这个问题已经被其他人问过,看到这个和这个,但是(我认为)他们都没有提供令人满意的答案。 根据 cppreference, 在开始扣除之前,请执行以下操作

回答 1 投票 0

C++11 移动语义行为特定问题[重复]

我已阅读以下文章,它对移动语义有了很好的了解: 有人可以向我解释一下移动语义吗? 但我仍然无法理解以下关于我的事情...

回答 2 投票 0

为什么C++中的移动语义在函数签名中有右值引用

考虑下面的移动赋值运算符: 类我的类{ 私人的: ssize_t buf_size; 无效* buf_ptr; 民众: MyClass &operator=(MyClass &&rhs) { 如果(这个!= &rhs){

回答 1 投票 0

右值参考还是左值?

我有一个类似性质的问题,就像 5 年前发布的问题一样: 为什么右值引用变量不是右值? 我主要关心的是为什么我可以这样做: 整数&& k = 3; k++; 但我可以...

回答 2 投票 0

传递给函数的右值是否仍然是右值?

我正在尝试了解有关传输语义、右值、x值、纯右值等的所有内容。 我有以下功能: 无效 f(int&& x, int i) { std::cout << boost::typei...

回答 1 投票 0

通过返回类型的模板推导将参数包传递给函数

我正在编写一个对象分配器,我想通过以下方式调用它: T 结果 = factoryObject.construct(argA, argB, argC); 我目前有这个设计,它有效...... 类工厂{ 无效*

回答 1 投票 0

为什么字符串文字是左值而不是x值?

Ben Saks 在 2019 年奥罗拉(科罗拉多州)CppCon 上的“理解价值类别”课程中(顺便说一句,这是很棒的一课)说: “字符串文字,例如“examplestring”,是

回答 1 投票 0

为什么右值引用根据类型的不同表现不同?

我正在阅读有关 C++ 右值引用和表达式的值类别的内容。但是,我无法理解(从左值、x值、纯右值的角度)为什么以下代码按预期工作:

回答 1 投票 0

在C++ 20规范中,哪里有规则说右值引用不能绑定到左值?

当然,这不会编译: 结构体X{}; X&& x = X(); X&& x2 = x; // 错误:对类型“X”的右值引用无法绑定到类型“X”的左值 哪里有这方面的相关规定...

回答 1 投票 0

为什么将右值绑定到 const 类型会使其成为左值?

这个问题可能没有最好的标题,但这里的代码将解释我想问的内容。 此代码运行并打印“左值”,但如果我从 MyPair 的第一个类型中删除 const...

回答 1 投票 0

未正确推导的全局函数引用

我正在使用 gcc12.2 并发现以下代码编译并产生奇怪的结果在 godbolt 中尝试。 (PS:切换到clang也是一样的结果) #包括 void global() { /...

回答 1 投票 0

高阶函数参数中的`&&`可以作为转发引用吗?

转发(或通用引用)的规范示例如下: 模板 void f(T&& 参数); IE。 “如果声明变量或参数具有类型......

回答 1 投票 0

为什么右值引用模板变量能够绑定到左值

为什么右值引用模板变量 b 能够绑定到左值 a? #包括 整数 = 3; 模板 T&& b = a; 诠释主要(){ 如果(std::is_sa...

回答 2 投票 0

C++ 中通用引用的重要性

我开始阅读 Scott Meyers 的书籍和博客文章以提高我的 C++ 技能。我阅读了有关 C++ 中的通用引用的博客,并试图现在了解它。我的问题是

回答 0 投票 0

C++:为什么一些模板参数是右值引用而其他的不是标准算法?

例如,让我们看一下std::reduce签名: 模板< class ExecutionPolicy, class ForwardIt, class T, class BinaryOp > T reduce( ExecutionPolicy&& 政策, 前...

回答 0 投票 0

std::find_if 中的 Predictor 仿函数不是引用

下面是std::find_if的定义 模板< class InputIt, class UnaryPredicate > constexpr InputIt find_if( InputIt first, InputIt last, UnaryPredicate p ); 为什么不使用

回答 1 投票 0

将左值传递给 RValue 的参数

我想知道这怎么可能? 模板 无效测试(T&& arg) { 参数 = 14; } 整数 = 23; 测试(一); 我的问题是函数 Test 需要参数...

回答 2 投票 0

如何在开关的情况下使用r值引用?

我想在switch(T)的情况下使用t(rvalue reference),但是得到一个错误,'t'的值不能用在常量表达式中。如何用正确的方法。#include 用...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.