rvalue-reference相关内容
每个人都可能知道我们结合使用右值引用和引用折叠规则来构建完善的转发功能,例如 template void f(T&&arg){ otherfunc(std :: forward
..
有了C ++的所有新功能(我认为C ++ 11就足够了),是什么阻止了 std :: minmax 函数返回一对引用的。 这样,如果一个提供两个可修改的引用,则可以对其进行修改。 #include //也许所有这些选项都可以简化 template共同结构 template struct com
..
我正在尝试形成一种std :: thread形式,该形式将包装器封装在该线程中执行的代码周围。不幸的是,由于我不太了解rvalues和我尝试传递的 Function 模板化类型,因此我无法编译它。这是我的代码: #include #include #include void Simple2(int a,int b){}
..
我目前正在写学位论文,其中还涉及对C ++ 11背后理论的一些解释,这很好,因为C ++是我选择的编程语言,并且该标准或多或少是免费的(N3337) 但是我在尝试准确而详细地解释新的xvalue类别时碰壁了。 据我了解,临时对象始终是xvalue,但我在标准中找不到该引用。据我了解,函数表达式的值类别调用了一个函数,具有非引用返回类型,是xvalue。该标准说:“ xvalue是某些包含rv
..
我想弄清楚我的类 A 的构造函数将拥有传递的 Data 参数的所有权。显而易见,要做的就是按值获取 unique_ptr : class A { public: A(std :: unique_ptr数据):_data(std :: move(data)){} std: :unique_ptr _数据; }; 但是,在我的用例
..
我有一个未模板化的仿函数对象,试图将它作为 std :: function 存储在另一个对象中。该对象确实是重量级的,因此标记为不可复制,但确实具有move构造函数。但是,尝试从临时构造函数构造或分配std :: function失败。 以下是引发错误的最小示例。 / /假装这是一个无法复制的重量级函子。 struct ExampleTest { int x; int
..
在C ++ 11中,当我们想将值(破坏性地复制)移动到容器中时,可以使用 std :: move 来提高效率。 SomeExpensiveType x = / * ... * /; vec.push_back(std :: move(x)); 但是我找不到其他方法。我的意思是这样的: SomeExpensiveType x = vec.back(); //复
..
如果我定义一个接受右值引用参数的函数: template void fooT(T& x){} 我可以这样称呼,使用GCC 4.5,使用 a , ar 或 arr : int a,& ar = a,&& arr = 7; fooT(a); fooT(ar); fooT(arr); 但是,调用类似的 non-tem
..
使用三个构造函数来考虑此类: class Circle { public: Circle(int r){ _radius = r; } Circle(const Circle& c){ _radius = c.radius(); cout
..
我试图理解 rvalue 引用。我已经看到它们如何在构造函数中使用,例如 std :: move 和 std :: forward 之类的东西,但是我仍然不明白为什么这行不通: void func(string&&str) { cout
..
如果我没记错,我认为const引用和右值引用都可以绑定到右值。返回前者的函数和返回后者的函数有什么实际区别? EDIT。我不能修改前者,但是为什么我会对修改右值感兴趣? 解决方案 一个 const 左值引用可以绑定到任何东西。右值引用只能绑定到非 const 右值。 非-const左值const左值非常量右值const右值 const T&是是是是 T&&否否是否
..
我正在编写一个库,其中包含了其他库中的许多函数和方法。为了避免处理返回值,我在应用 std :: forward 像这样: template T&&包装器(T& t){ f(t); // t作为左值 传递return std :: forward(t); } f 返回 void 并使用 T& (或超载)。包装器始终返回包装器的参数,
..
关于C ++ 0x右值的主要建议似乎是在类中添加move构造函数和move运算符,直到编译器默认实现它们为止。 但是等待如果您使用VC10,这是一个失败的策略,因为在VC10 SP1或最坏的情况下,直到VC11,自动生成可能不会出现。 这是我的问题所在。编写所有这些重复的代码并不有趣。而且令人讨厌。但这对于那些认为很慢的班级来说是一个很好的负担。 :: sighs :: C ++
..
在某些O类中,我具有模板化函数 test2 : struct A {int value;}; 结构O { A值; template static void test2(Args& args){ std :: cout
..
以下是我的问题的简化代码, 避免重载(int&& x){ cout void fn(T& x){ 重载(x); } int main(){ fn(0); 返回0; } 我遇到了编译错误 无法将' int '左值绑定到' int& ' 重载(x);
..
我假设当通用引用参数与右值引用参数匹配时,返回右值引用参数。但是,我的测试表明,通用引用函数模板将右值引用转换为左值引用。为什么会这样? #include #include 使用命名空间std; 模板 T f1(T& t){//
..
typedef void(&& RF)(void * p); RF rf() { return f; } int ay [10] = {0}; typedef int(& RA)[10]; RA ra() { return ay; //错误 } cout :: valu
..
是Visual C ++ 2010中的错误还是正确的行为? template T f(T const& r) { return r; } template T f(T& r) { static_assert(false,“ no way”); //
..
我正在学习通过引用传递,这是我所做的测试: #include 使用命名空间std; int i = 0; //如果不加注释,编译器将给出模糊的定义错误。 // void paramCheck(string s){ // cout
..
我最近将思想集中在C ++ 0x的glvalues,xvalues和prvalues以及rvalue引用的概念上。但是,还有一件事让我难以理解: 什么是“对函数类型的右值引用” ?草案中多次提到它。为什么引入这样的概念? 解决方案 我讨厌循环,但对函数类型的右值引用是对功能类型。有诸如函数类型之类的东西。 void()。您可以形成对此的右值引用。 根据 N3055 ,它是一个x
..