相关疑难解决方法(0)

什么是复制和交换习语?

这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?

虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:

c++ c++-faq copy-constructor assignment-operator copy-and-swap

1907
推荐指数
5
解决办法
34万
查看次数

T &&(双&符号)在C++ 11中意味着什么?

我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.

首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.

究竟是什么意思?

乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.

c++ c++-faq rvalue-reference perfect-forwarding c++11

747
推荐指数
4
解决办法
18万
查看次数

什么是std :: move(),什么时候应该使用?

  1. 它是什么?
  2. 它有什么作用?
  3. 什么时候应该使用?

赞赏良好的链接.

c++ c++-faq move-semantics c++11 stdmove

581
推荐指数
6
解决办法
24万
查看次数

如何将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;

};
Run Code Online (Sandbox Code Playgroud)

这是我应该如何编写unique_ptr参数的函数?

我需要std::move在调用代码中使用吗?

Base::UPtr b1;
Base::UPtr b2(new Base());

b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
Run Code Online (Sandbox Code Playgroud)

c++ arguments unique-ptr c++11

377
推荐指数
5
解决办法
15万
查看次数

在C++中通过值传递或通过常量引用传递是否更好?

在C++中通过值传递或通过常量引用传递是否更好?

我想知道哪个是更好的做法.我意识到通过常量引用传递应该在程序中提供更好的性能,因为你没有复制变量.

c++ variables constants pass-by-reference pass-by-value

203
推荐指数
6
解决办法
10万
查看次数

为什么在C++ 11中使用&&时使用std :: move?

可能重复:
有人可以向我解释移动语义吗?

我最近参加了一个C++ 11研讨会,并给出了以下一些建议.

when you have && and you are unsure, you will almost always use std::move
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么你应该使用std::move而不是某些替代品以及某些不应该使用的情况std::move

c++ move-semantics c++11

59
推荐指数
2
解决办法
3万
查看次数

在队列::推送后双重免费或损坏

#include <queue>
using namespace std;

class Test{
    int *myArray;

        public:
    Test(){
        myArray = new int[10];
    }

    ~Test(){
        delete[] myArray;
    }

};


int main(){
    queue<Test> q
    Test t;
    q.push(t);
}
Run Code Online (Sandbox Code Playgroud)

运行此操作后,我收到运行时错误"double free or corruption".如果我摆脱析构函数内容(delete),它工作正常.怎么了?

c++ runtime-error delete-operator

52
推荐指数
2
解决办法
10万
查看次数

正确使用右值引用作为参数

我们以下面的方法为例:

void Asset::Load( const std::string& path )
{
    // complicated method....
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一般用途如下:

Asset exampleAsset;
exampleAsset.Load("image0.png");
Run Code Online (Sandbox Code Playgroud)

由于我们大多数时候都知道Path是一个临时右值,所以添加这个方法的Rvalue版本是否有意义?如果是这样,这是一个正确的实施;

void Asset::Load( const std::string& path )
{
    // complicated method....
}
void Asset::Load( std::string&& path )
{
     Load(path); // call the above method
}
Run Code Online (Sandbox Code Playgroud)

这是编写rvalue版本方法的正确方法吗?

c++ c++11

52
推荐指数
3
解决办法
3万
查看次数

从函数返回值时使用std :: move()以避免复制

考虑支持默认移动语义的类型T. 还要考虑以下功能:

T f() {
   T t;
   return t;
}

T o = f();
Run Code Online (Sandbox Code Playgroud)

在旧的C++ 03中,一些非最佳编译器可能会调用两次复制构造函数,一个用于"返回对象",另一个用于o.

在c ++ 11中,由于tinside f()是左值,那些编译器可能像以前一样调用复制构造函数,然后调用o的移动构造函数.

是否正确说明避免第一次"额外复制"的唯一方法是t在返回时移动?

T f() {
   T t;
   return std::move(t);
}
Run Code Online (Sandbox Code Playgroud)

c++

49
推荐指数
2
解决办法
1万
查看次数

如何实际实施五条规则?

在底部更新

问题1:如何为管理相当繁重的资源的类实现五条规则,但是您希望它按值传递,因为这极大地简化并美化了它的用法?或者甚至不需要所有五项规则?

在实践中,我开始使用3D成像,其中图像通常是128*128*128双倍.能够写这样的东西会让数学变得更容易:

Data a = MakeData();
Data c = 5 * a + ( 1 + MakeMoreData() ) / 3;
Run Code Online (Sandbox Code Playgroud)

问题2:使用复制省略/ RVO /移动语义的组合,编译器应该能够以最少的复制完成此操作,不是吗?

我试图找出如何做到这一点,所以我从基础开始; 假设一个对象实现了实现复制和赋值的传统方式:

class AnObject
{
public:
  AnObject( size_t n = 0 ) :
    n( n ),
    a( new int[ n ] )
  {}
  AnObject( const AnObject& rh ) :
    n( rh.n ),
    a( new int[ rh.n ] )
  {
    std::copy( rh.a, rh.a + n, a );
  }
  AnObject& operator = ( …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference move-semantics c++11

42
推荐指数
2
解决办法
5521
查看次数