Questions tagged «rvalue-reference»

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

4
T &&(双“&”号)在C ++ 11中是什么意思?
我一直在研究C ++ 11的一些新功能,而我注意到的一个是在声明变量(如)时使用了双“&”号T&& var。 首先,这只野兽叫什么?我希望Google允许我们搜索这样的标点符号。 这到底是什么意思? 乍一看,它似乎是一个双重引用(如C样式的双指针T** var),但是我很难考虑到这种情况的用例。

6
使用std :: forward的主要目的是什么,它可以解决哪些问题?
在完善的转发,std::forward是用来转换指定的右值引用t1,并t2以不具名rvalue引用。这样做的目的是什么?inner如果我们将t1&保留t2为左值,对调用的函数有何影响? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11右值和移动语义混淆(返回语句)
我试图理解右值引用并移动C ++ 11的语义。 这些示例之间有什么区别,哪些将不进行矢量复制? 第一个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 第二个例子 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 第三个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

6
在Lambda中移动捕获
如何在C ++ 11 lambda中通过移动(也称为右值引用)捕获? 我正在尝试写这样的东西: std::unique_ptr<int> myPointer(new int); std::function<void(void)> example = [std::move(myPointer)]{ *myPointer = 4; };



1
如何对可变参数函数中的所有参数调用std :: forward?
我只是在编写一个通用对象工厂,并使用boost预处理器元库制作一个可变参数模板(使用2010,但它不支持它们)。我的函数使用rval引用并std::forward进行完美的转发,这让我开始想...当C ++ 0X出现并且我有一个标准的编译器时,我将使用真实的可变参数模板进行此操作。不过,我std::forward该如何谈谈? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 我能想到的唯一方法是需要手动解压缩... params,而且我也还没有。有没有一种更快的语法可以工作?


1
具有指定模板参数的C ++ 11 make_pair无法编译
我只是在启用-std = c ++ 11的情况下玩g ++ 4.7(后面的快照之一)。我试图编译一些现有的代码库,而一个失败的案例使我有些困惑。 如果有人可以解释发生了什么,我将不胜感激。 这是代码: #include <utility> #include <iostream> #include <vector> #include <string> int main ( ) { std::string s = "abc"; // 1 ok std::pair < std::string, int > a = std::make_pair ( s, 7 ); // 2 error on the next line std::pair < …

5
在任何情况下,返回RValue引用(&&)都是有用的吗?
函数应返回RValue引用吗?一种技术,技巧,成语或模式? MyClass&& func( ... ); 我知道一般会返回引用的危险,但是有时候我们还是这样做,不是吗?T& T::operator=(T)只是一个惯用的例子。但是T&& func(...)呢?有没有一般的地方可以从中受益呢?与仅编写客户端代码相比,编写库或API代码时可能有所不同吗?

7
传递值然后移动构成一个坏习惯吗?
由于我们在C ++中具有移动语义,因此如今很常见 void set_a(A a) { _a = std::move(a); } 理由是,如果a是右值,则副本将被删除,并且只有一招。 但是,如果a是左值会怎样?似乎将有一个副本构造,然后是一个移动分配(假设A具有正确的移动分配运算符)。如果对象具有太多的成员变量,则移动分配的成本可能很高。 另一方面,如果我们这样做 void set_a(const A& a) { _a = a; } 将只有一份副本分配。如果我们要传递左值,是否可以说这种方法比按值传递惯用法更可取?

1
没有“右值引用*此”功能的解决方法
我在可移动对象周围有一个代理容器类,并希望该代理能够隐式地产生对基础对象的右值引用,但仅当代理自身被移动时才是如此。 我相信我将能够按照建议n2439 “将移动语义扩展到* this”来实现此行为,但是它在gcc发行版中尚不可用,并且将有一段时间。 下面的代码是我最终的目标,但是目前无法实现。在我可以使用此功能之前,是否有任何等效的解决方法? template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; };

3
Lambda闭包左值可以作为右值参考参数传递
我发现lvaluelambda闭包始终可以作为rvalue函数参数传递。 请参见以下简单演示。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

2
为什么这里的枚举变量是右值?
例: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } 编译时出现以下错误: <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.