相关疑难解决方法(0)

如何将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万
查看次数

为什么临时取rvalue的地址是违法的?

根据" 如何绕过警告"rvalue用作左值"? ",Visual Studio只会警告代码如下:

int bar() {
   return 3;
}

void foo(int* ptr) {

}

int main() {
   foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)

在C++中,不允许获取临时(或者至少是由rvalue表达式引用的对象?)的地址,我认为这是因为临时保证甚至不能保存.

但是,虽然诊断程序可能以编译器选择的任何形式呈现,但我仍然期望MSVS 出错而不是在这种情况下发出警告.

那么,临时保证有储存吗?如果是这样,为什么上面的代码首先被禁止?

c++

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

std::move 的逆函数是否存在?

std::move当移动尚未被隐式允许时(例如通常从函数返回本地对象时),可用于显式允许移动语义。

现在,我想知道(特别是在本地返回和隐式移动的情况下),是否存在与此相反的东西std::move阻止移动对象(但仍然允许复制)。

这还有道理吗?

c++ move-semantics c++11

6
推荐指数
1
解决办法
1396
查看次数

函数双重到std :: move?

假设我有一个只有一个构造函数的类:

class T {
 public:
  T(BigClass&& big) : big(std::move(big)) {}
  ...

  SomeBigClass
};
Run Code Online (Sandbox Code Playgroud)

在大多数地方,构造函数在temporaries上调用,但在一个地方我需要制作BigClass的显式副本,因为它不是临时的,并且将在循环中多次使用:

void foo(const BigClass& big) {
  while (...) {
    T t(std::make_a_copy(big));
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

std::move在C++ 11或C++ 14中是否有任何"双重"功能可以取代上面的make_a_copy?

编辑:一些澄清.

c++ move-semantics c++11

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

标签 统计

c++ ×4

c++11 ×3

move-semantics ×2

arguments ×1

unique-ptr ×1