Tag: rvalue reference

避免构造函数中的const引用和右值引用的指数增长

我正在为一个机器学习库编写一些模板类,而且我很多时候都面临着这个问题。 我主要使用策略模式,其中类接收作为不同function的模板参数策略,例如: template <class Loss, class Optimizer> class LinearClassifier { … } 问题在于构造函数。 随着策略数量(模板参数)的增长,const引用和rvalue引用的组合指数级增长。 在前面的例子中: LinearClassifier(const Loss& loss, const Optimizer& optimizer) : _loss(loss), _optimizer(optimizer) {} LinearClassifier(Loss&& loss, const Optimizer& optimizer) : _loss(std::move(loss)), _optimizer(optimizer) {} LinearClassifier(const Loss& loss, Optimizer&& optimizer) : _loss(loss), _optimizer(std::move(optimizer)) {} LinearClassifier(Loss&& loss, Optimizer&& optimizer) : _loss(std::move(loss)), _optimizer(std::move(optimizer)) {} 有没有办法避免这种情况?

如何实际执行五项规则?

在底部更新 问题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( […]

为什么有些人使用交换分配移动?

例如,stdlibc ++具有以下内容: unique_lock& operator=(unique_lock&& __u) { if(_M_owns) unlock(); unique_lock(std::move(__u)).swap(*this); __u._M_device = 0; __u._M_owns = false; return *this; } 为什么不直接将这两个__u成员分配给* this? 不交换意味着__u被分配了*这个成员,只是以后再分配0和false …在这种情况下交换是做不必要的工作。 我错过了什么? (unique_lock :: swap只是在每个成员上执行std :: swap)

重载参考,而不是唯一的传值+ 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 […]

对象,右值引用,const引用之间的重载parsing

给定所有这三个函数,这个调用是不明确的。 int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); 除去f( int )会导致Clang和GCC优先于左值引用的右值引用。 但相反,删除任何引用重载都会导致f( int )模糊。 重载parsing通常是用严格的偏序来完成的,但是int似乎相当于两个不相等的东西。 这里的规则是什么? 我似乎记得有关这方面的缺陷报告。 在未来的标准中, int &&可能比int更int吗? 引用必须绑定到初始化程序,而对象types不是那么受限制。 因此, T与T &&之间的重载可能有效地意味着“如果给予所有权,则使用现有对象,否则复制”。 (这与纯传值类似,但是节省了移动的开销)。由于这些编译器当前正在工作,所以这必须通过重载T const &和T && ,并明确复制来完成。 但我甚至不确定这是否是严格的标准。

做rvalue引用const有什么用?

我想不是,但我想确认一下。 有什么用的const Foo&& ,其中Foo是一个类的types?

我可以通常/总是使用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&& […]

没有“右值引用* 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; };

为什么用户定义的移动构造函数禁用隐式的复制构造函数?

虽然我正在阅读boost / shared_ptr.hpp,我看到了这样的代码: // generated copy constructor, destructor are fine… #if defined( BOOST_HAS_RVALUE_REFS ) // … except in C++0x, move disables the implicit copy shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn ) // never throws { } #endif 什么评论“生成的副本构造函数,析构函数是好的,除了在C + + 11,移动禁用隐式副本”的意思呢? 我们是否总是自己写复制文件来防止这种情况出现在C ++ 11中?

在C ++中,哪些类(左值,右值,左值等)可以生成临时types的expression式?

以下是一些示例代码: #include <iostream> class Foo { public: explicit Foo(int x) : data(x) {}; Foo& operator++() { data += 1; return *this; } void *get_addr() { return (void*)this; } friend Foo operator + (const Foo& lhs, const Foo& rhs); friend std::ostream& operator << (std::ostream& os, const Foo& f); private: int data; }; std::ostream& operator << (std::ostream& […]