Tag: move semantics

如何实际执行五项规则?

在底部更新 问题1:如何执行五级规则来pipe理相当重的资源,但希望通过价值来传递这些资源,因为这极大地简化和美化了它的用法。 还是不是规则的所有五项甚至需要? 在实践中,我正在开始3D成像,其中图像通常是128 * 128 * 128加倍。 能够写这样的东西会使math更容易: Data a = MakeData(); Data c = 5 * a + ( 1 + MakeMoreData() ) / 3; q2:使用复制elision / RVO /移动语义的组合,编译器应该能够以最less的复制这个,不是? 我试图找出如何做到这一点,所以我开始了基础知识; 假设一个实现复制和分配的传统方式的对象: class AnObject { public: AnObject( size_t n = 0 ) : n( n ), a( new int[ n ] ) {} AnObject( […]

移动语义和function顺序评估

假设我有以下几点: #include <memory> struct A { int x; }; class B { B(int x, std::unique_ptr<A> a); }; class C : public B { C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {} }; 如果我正确理解有关“函数参数的未指定顺序”的C ++规则,则此代码是不安全的。 如果B的构造函数的第二个参数是使用移动构造函数首先构造的,那么现在包含一个nullptr ,expression式a->x将触发未定义的行为(可能是段错误)。 如果第一个参数是先构造的,那么一切都将按预期工作。 如果这是一个正常的函数调用,我们可以创build一个临时的: auto x = a->x B b{x, std::move(a)}; 但在类初始化列表中,我们没有创build临时variables的自由。 假设我不能改变B ,是否有任何可能的方法来完成上述? 即解除引用和移动一个unique_ptr在同一个函数调用expression式而不创build临时? 如果你可以改变B的构造函数,但不添加新的方法,如setX(int) ? 会有帮助吗? 谢谢

重载参考,而不是唯一的传值+ std :: move?

看来有关C ++ 0x的右值的主要build议是添加移动构造函数并将运算符移到您的类中,直到编译器默认实现它们。 但是如果你使用VC10,等待是一个失败的策略,因为在VC10 SP1之前,自动生成可能不会在这里,或者在最坏的情况下VC11。 可能的话,这个等待会以年计算。 这是我的问题。 编写所有这些重复的代码并不好玩。 而且看起来不愉快。 但这是一个很受欢迎的负担,因为这些课程被认为是缓慢的。 数百乃至数千个较小的class级并非如此。 ::叹息:: C ++ 0x应该让我写更less的代码,而不是更多! 然后我有一个想法。 许多人分享,我猜想。 为什么不把价值通过一切? 不会std :: move + copy elision使这近乎最佳? 示例1 – 典型的Pre-0x构造函数 OurClass::OurClass(const SomeClass& obj) : obj(obj) {} SomeClass o; OurClass(o); // single copy OurClass(std::move(o)); // single copy OurClass(SomeClass()); // single copy 缺点: rvalues浪费的副本。 示例2 – 推荐的C ++ 0x? OurClass::OurClass(const […]

我可以通常/总是使用std :: forward而不是std :: move吗?

我一直在观看斯科特·迈耶斯(Scott Meyers) 关于 C ++和Beyond 2012会议上Universal Reference的演讲,到目前为止一切都很有意义。 然而,观众在大约50分钟的时间里问了一个问题,我也在想。 迈尔斯说,他不关心答案,因为它是非惯用的,会愚蠢的他的头脑,但我仍然感兴趣。 代码如下: // Typical function bodies with overloading: void doWork(const Widget& param) // copy { // ops and exprs using param } void doWork(Widget&& param) // move { // ops and exprs using std::move(param) } // Typical function implementations with universal reference: template <typename T> void doWork(T&& […]

是否unique_ptr保证移动后存储nullptr?

是否unique_ptr保证移动后存储nullptr ? std::unique_ptr<int> p1{new int{23}}; std::unique_ptr<int> p2{std::move(p1)}; assert(!p1); // is this always true?

没有“右值引用* this”特性的解决方法

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

移动赋值运算符和`if(this!=&rhs)`

在一个类的赋值操作符中,通常需要检查被赋值的对象是否是调用对象,这样就不会搞砸了: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } 移动赋值操作符需要同样的东西吗? 有没有this == &rhs将是真实的情况? ? Class::operator=(Class&& rhs) { ? }

何时在C ++ 11中创build一个不可移动的types?

我很惊讶这没有出现在我的search结果中,我以为有人会问这之前,考虑到在C + + 11的移动语义的有用性: 我什么时候需要(或者对我来说是一个好主意)在C ++ 11中创build一个不可移动的类? (除现有代码的兼容性问题之外的原因,即。)

什么是“右值参考”?

在clang的C ++ 11状态页面中find了一个叫做“* this的右值引用”的提议。 我读了很多关于右值的引用并理解了它们,但我不认为我知道这个。 我也无法使用这些条款在网上find很多资源。 有一个链接到页面上的提案文件: N2439 (将移动语义扩展到*这个),但我也没有从那里得到很多例子。 这个function是关于什么的?

我如何使用一个std :: unique_ptr成员的定制删除器?

我有一个unique_ptr成员的类。 class Foo { private: std::unique_ptr<Bar> bar; … }; Bar是一个具有create()函数和destroy()函数的第三方类。 如果我想在独立函数中使用std::unique_ptr ,我可以这样做: void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); … } 有没有办法做到这一点与std::unique_ptr作为一个类的成员?