-
73 votesanswersviews
具有指定模板参数的C 11 make_pair无法编译
我刚刚玩了启用-std = c 11的g 4.7(后面的一个快照) . 我试图编译一些现有的代码库,一个失败的案例让我感到困惑 . 如果有人能解释发生了什么,我将不胜感激 . 这是代码 #include <utility> #include <iostream> #include <vector> #include <string> int mai... -
362 votesanswersviews
如何从函数中返回一个对象,考虑C 11 rvalues并移动语义?
我正在尝试理解rvalue引用并移动C 11的语义 . 这些示例之间有什么区别,哪些不会执行矢量复制? 第一个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&r... -
313 votesanswersviews
三阶规则与C 11成为五次规则?
所以,在看了rvalue引用的this wonderful lecture之后,我认为每个类都会受益于这样的"move constructor", template<class T> MyClass(T&& other) edit ,当然还有"move assignment operator", template<cla... -
7 votesanswersviews
您是否可以将C RValue参考参数标记为const
我一直在切换模板工厂函数来使用(和理解)std :: forward来支持rvalues和移动语义 . 我通常用于模板类的样板工厂函数始终将参数标记为const: #include <iostream> #include <utility> template<typename T, typename U> struct MyPair{ MyPair(c... -
1 votesanswersviews
传递右值引用与非const左值引用
如果在将变量传递给函数后我没有使用变量,是否将其传递给非常量左值引用或使用std :: move将其传递给右值引用是否重要 . 假设存在两种不同的重载 . 这两种情况的唯一区别是传递的对象的生命周期,如果我通过右值引用则会更早结束 . 还有其他因素需要考虑吗? 如果我有一个函数foo重载像: void foo(X& x); void foo(X&& x); X x; fo... -
648 votesanswersviews
T &&(双&符号)在C 11中意味着什么?
我注意到在声明变量时是双&符号,如 T&& var . 首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号 . 究竟是什么意思? 乍一看,它似乎是一个双引用(如C风格的双指针 T** var ),但我很难想到一个用例 . -
3 votesanswersviews
为什么rvalue引用参数与重载决策中的const引用匹配?
潜在相关文章: Overload resolution between object, rvalue reference, const reference std::begin and R-values 对于STL容器 C , std::begin(C) 和类似的访问函数(包括 std::data(C) (因为C 17))应该具有 C::begin() 和其他对应的 C 方法的相同行为... -
20 votesanswersviews
为什么C 11具有值参数的隐式移动,而不是rvalue参数?
在C 11中,值参数(和其他值)在返回时享受隐式移动: A func(A a) { return a; // uses A::A(A&&) if it exists } 至少在MSVC 2010中,右值参考参数需要 std::move : A func(A && a) { return a; // uses A::A(A const&) e... -
12 votesanswersviews
在重载算法中移动语义和Rvalue-Reference
我正在用C编写一个小型数值分析库 . 我一直在尝试使用最新的C 11功能,包括移动语义 . 我理解以下帖子中的讨论和最佳答案:C++11 rvalues and move semantics confusion (return statement),但有一种情况我仍然试图解决这个问题 . 我有一个类,称之为 T ,它配备了重载运算符 . 我也有复制和移动构造函数 . T (const T &... -
3 votesanswersviews
C移动语义 - 何时返回右值引用
我已经阅读了几篇文章,说在返回局部变量时允许移动语义的函数签名应该看起来与它按值返回完全一样,只要定义了移动构造函数/移动赋值运算符,就会发生RVO或移动语义视情况而定 . 虽然我读过许多人说你的返回类型几乎从不是一个右值引用,因为它在本地移动变量的情况下返回一个悬空引用或者可以阻止RVO,我想知道当移动对象时它是否正确具有超出函数返回范围的生命周期,例如移动将继续存在的对象的全局对象或成员对象 ... -
82 votesanswersviews
如何在可变参数函数中的所有参数上调用std :: forward?
我只是编写一个通用对象工厂并使用boost预处理器元库来创建一个可变参数模板(使用2010并且它不支持它们) . 我的函数使用rval引用和 std::forward 进行完美的转发,它让我思考...当C 0X出来并且我有一个标准的编译器时,我会使用真正的可变参数模板 . 但是,我怎么称呼 std::forward ? template <typename ...Params> voi... -
41 votesanswersviews
如何实际实施五条规则?
UPDATE 在底部 q1: 如何为管理相当繁重的资源的类实现rule of five,但是您希望它按值传递,因为这极大地简化并美化了它的用法?或者甚至不需要所有五项规则? 在实践中,我开始使用3D成像,其中图像通常是128 * 128 * 128双倍 . 能够写这样的东西会让数学变得更容易: Data a = MakeData(); Data c = 5 * a + ( 1 + MakeMore... -
3 votesanswersviews
使用可变参数模板参数丢失rvalue限定符
我正在尝试编写一个通用工厂类,为我的应用程序自动注册类型 . 为了保证灵活性,这个工厂有一个构造函数参数的可变参数模板参数;即它允许默认构造函数或构造函数需要任意数量的参数 . 参数名称相当不言自明; AbstractType是工厂的抽象基类;返回的对象将是此类型的 std::shared_ptr . 这个通用工厂工作正常,我为它编写的所有测试工作都非常好,直到我试图为包含不允许复制构造或赋值的... -
4 votesanswersviews
Visual C 2010,rvalue参考错误?
它是Visual C 2010中的错误还是正确的行为? template<class T> T f(T const &r) { return r; } template<class T> T f(T &&r) { static_assert(false, "no way"); //< line # 10 ...