rvalue-reference 相关问题

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

std::pair 构造函数重载采用元组如何判断元组内容是否是 r-val 引用?

对于措辞尴尬的问题表示歉意。我的不确定性基于可以大致简化为以下场景的情况。 我有一个 Foo 类,我想要一个 std::pair

回答 1 投票 0

右值引用 Cpp17MoveConstructible 吗?

右值引用满足 Cpp17MoveConstructible 要求吗? 为此,在表达式 T u = rv; 中,u 需要“等于”rv。如果 T 是右值引用...

回答 1 投票 0

C++ 在模板参数和 lambda 的 `auto` 参数之间转发引用方面的差异

比较以下两种情况: 模板 void f1(Args&&... args) { do_smth(std::forward(args)...); } 自动 f2 = [](自动&&... args) { do_smth(s...

回答 1 投票 0

值、右值引用、const 左值引用之间的重载解析

考虑到所有三个函数,这个调用是不明确的。 int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); 删除 f( int ) 会导致 Clang 和 GCC 更喜欢右值

回答 1 投票 0

为什么调用 const 引用而不是右值引用以及 std::move 是如何工作的?

#包括 void bar(std::string& s) { std::cout << "ref" << std::endl;} void bar(const std::string& s) { std::cout << "const ref" <&...

回答 1 投票 0

C++ 中的对象如何找到右值引用(未命名值)? [重复]

我有一个名为 Matrix 的类。我想要重载运算符!返回矩阵的转置。 当主矩阵是一个未命名的对象时,我更喜欢使用它分配的内存来构造转置矩阵,

回答 1 投票 0

在函数中使用时,右值引用是否被视为左值?

我发布了这个答案:https://stackoverflow.com/a/28459180/2642059 其中包含以下代码: 无效foo(字符串&&酒吧){ 字符串* 温度 = &bar; 计算<< *temp <<...

回答 4 投票 0

通过右值引用返回是否更高效?

例如: Beta_ab&& Beta::toAB() const { 返回移动(Beta_ab(1, 1)); }

回答 2 投票 0

是否可以编写一个可以独占存储左值引用或对象的类?

我厌倦了按值传递所有对象,然后移动或重载左值和右值。我正在尝试编写一个类,它可以存储左值引用或普通对象(如果 rv...

回答 1 投票 0

强制转换为右值引用可防止复制省略

我阅读了更多相关文章,但没有一个答案能够澄清我的疑虑。为什么在下面的代码中,仅当没有转换为右值引用时才会进行优化,否则......

回答 1 投票 0

禁用复制/移动省略时如何有效返回对象?

假设编译时禁用复制省略,那么为了消除不必要的复制(模拟复制省略),以下操作是否有效? 容器 getContainer() { 康塔...

回答 1 投票 0

当 T1 与 T2 引用相关时(并且 T1 和 T2 不是类类型),为什么 C++ 禁止将 T1 && 绑定到 T2 左值?

我正在探索这个问题:给定 char * x,为什么 const char * && rc2 = x 不能编译? 我发现 dcl.init.ref#5.4.4 上面写着(当我们将 T1 && 绑定到 T2 左值时,其中 T2 ...

回答 1 投票 0

当 T1 与 T2 引用相关时(并且 T1 和 T2 不是类类型),为什么 C++ 禁止将 T1 && 绑定到 T2 左值

我正在探索这个问题:给定 char * x,为什么 const char * && rc2 = x 不能编译? 我发现 dcl.init.ref#5.4.4 上面写着(当我们将 T1 && 绑定到 T2 左值时,其中 T2 ...

回答 1 投票 0

当我们使用右值引用时到底会发生什么以及 std::move 是如何工作的? [重复]

我正在尝试理解右值引用和移动语义。在下面的代码中,当我将 10 传递给 Print 函数时,它会调用右值引用重载,这是预期的。但到底发生了什么,w...

回答 3 投票 0

通过栈中的`std::move`返回变量不安全吗? (编译器对此显示警告)

我读了很多答案,局部变量可以通过 std::move 安全地返回。 但是当我尝试时,编译器显示如下警告。 类 MyClass {}; MyClass&& func() { 我的班级c; ...

回答 1 投票 0

为什么将引用绑定到右值是合法的?

据我了解,从函数返回右值引用是危险的原因是由于以下代码: T&& f(T&& x) { do_something_to_T(x);返回

回答 1 投票 0

在循环中对同一参数使用 std::forward

我知道在某些情况下,在循环中对同一参数使用 std::forward 是错误的,因为它可能会导致从移动的对象移动,如下所示: 模板 自动应用十次(T&...

回答 1 投票 0

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

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

回答 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

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