Tag: c ++ 11

我能做些什么来移动的对象?

这个标准是否准确地定义了一个对象从一个对象中移出后我能做些什么? 我曾经认为,用移动物体做的所有事情都是破坏它,但这还不够。 例如,采用标准库中定义的函数模板swap : template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 显然,必须能够分配移动的对象,否则第2行和第3行将失败。 那么还有什么我可以做从移动的对象? 我到底能在标准中找到这些细节? (顺便说一下,为什么它是T c = std::move(a);而不是T c(std::move(a));在第一行?)

如何将unique_ptr参数传递给构造函数或函数?

我新移动C ++ 11中的语义,我不知道如何处理构造函数或函数中的unique_ptr参数。 考虑这个引用自身的类: #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; 这是我应该如何编写函数采取unique_ptr参数? 我需要在调用代码中使用std::move吗? Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?

C ++ 0x没有信号量? 如何同步线程?

C ++ 0x是否会出现没有信号量的情况? 关于使用信号量,Stack Overflow已经有一些问题了。 我一直使用它们(posix信号量)让一个线程在另一个线程中等待某个事件: void thread0(…) { doSomething0(); event1.wait(); … } void thread1(…) { doSomething1(); event1.post(); … } 如果我用互斥体做到这一点: void thread0(…) { doSomething0(); event1.lock(); event1.unlock(); … } void thread1(…) { event1.lock(); doSomethingth1(); event1.unlock(); … } 问题:这是丑陋的,并不能保证thread1首先锁定互斥锁(假设同一个线程应该锁定和解锁互斥锁,在thread0和thread1开始之前,也不能锁定event1)。 所以既然boost还没有信号量,那么实现上面的最简单的方法是什么?

C ++模板typedef

我有一堂课 template<size_t N, size_t M> class Matrix { // …. }; 我想创建一个typedef来创建一个Vector (列向量),它相当于一个大小为N和1的Matrix 。类似的东西: typedef Matrix<N,1> Vector<N>; 这会产生编译错误。 以下创建类似的东西,但不完全是我想要的: template <int N> class Vector: public Matrix<N,1> { }; 有没有一个解决方案或不是太昂贵的解决方法/最佳实践呢?

传递lambda作为函数指针

是否有可能传递一个lambda函数作为函数指针? 如果是这样,我必须做错误的东西,因为我得到一个编译错误。 考虑下面的例子 using DecisionFn = bool(*)(); class Decide { public: Decide(DecisionFn dec) : _dec{dec} {} private: DecisionFn _dec; }; int main() { int x = 5; Decide greaterThanThree{ [x](){ return x > 3; } }; return 0; } 当我尝试编译这个 ,我得到以下编译错误: In function 'int main()': 17:31: error: the value of 'x' is not usable in […]

是否需要知道T的完整定义的std :: unique_ptr <T>?

我有一些代码,如下所示: #include <memory> class Thing; class MyClass { std::unique_ptr< Thing > my_thing; }; 如果我将这个头文件包含在一个不包含Thing类型定义的cpp中,那么这个不会在VS2010-SP1下编译: 1> C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ memory(2067):error C2027:使用未定义的类型'Thing' 用std::unique_ptr std::shared_ptr替换std::unique_ptr并编译。 所以,我猜测这是当前VS2010 std::unique_ptr的实现,需要完整的定义,而且完全依赖于实现。 还是呢? 有没有什么标准的要求,使std::unique_ptr的实现不可能只与前向声明一起工作? 这感觉很奇怪,因为它只应该指向Thing ,不是吗?

C ++ 11 rvalues和移动语义混淆(return语句)

我想了解右值引用并移动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();

如何在矢量增长时执行移动语义?

我有一个特定的类A的对象的std ::向量。类是不平凡的,并有复制构造函数和移动构造函数定义。 std::vector<A> myvec; 如果我用A对象填充矢量(使用例如myvec.push_back(a) ),则使用复制构造函数A( const A&)来实例化矢量中的元素的新副本,矢量将变大。 我可以以某种方式强制A类的移动构造函数使用beging使用吗?