相关疑难解决方法(0)

什么时候返回语句需要显式移动?

对另一个问题评论中, Jonathan Wakely回应了我的陈述:

您永远不需要显式移动局部变量函数返回值.这是隐含的举动

- >

...永远不要说永远......如果局部变量与返回类型的类型不同,则需要显式移动,例如std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; },但如果类型相同,则可能会移动...

所以有时我们可能不得不在返回时移动局部变量.

这个例子

std::unique_ptr<base> f() { 
  auto p = std::make_unique<derived>();
  p->foo(); 
  return p; 
}
Run Code Online (Sandbox Code Playgroud)

很好,因为它给出了编译错误

> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一个很好的机会来检测这一般 - 这是这里的语言规则或unique_ptr ??

c++ return implicit-conversion move-semantics c++11

18
推荐指数
1
解决办法
1442
查看次数

是否存在与`std :: move`具有相反效果的强制转换(或标准函数)

首先,这个问题是不是重复功能双到std ::移动?或者std :: move的反转是否存在?.我不是要问一种机制,以防止在原本会发生的情况下移动,而是复制; 相反,我正在询问一种机制,使rvalue被接受在一个将被绑定到可修改左值引用的位置.事实上,这std::move与发明的情况完全相反(即,在一个将被绑定到(可修改的)右值参考的位置上接受可修改的左值).

在我感兴趣的情况下,不会接受右值,因为上下文需要可修改的左值引用.由于某种原因,我不太明白但愿意接受,(可修改的)右值表达式将绑定到一个常量左值引用(不引入额外的临时值),但它不会绑定到可修改的左值引用( gcc给我的错误信息是"从'A'类型的右值'中'A&'类型的非const引用的无效初始化",而clang说"对类型'A'的非const左值引用不能绑定到临时的输入'A'';奇怪的是我无法让这些编译器中的任何一个承认有问题的表达式有'A &&'类型,即使该表达式实际上是static_cast<A&&>(...)单独引发错误的形式.我可以理解,通常不希望在需要可修改的左值引用的位置接受rvalue表达式,因为它意味着通过该左值引用完成的任何修改都将丢失,但正如调用std::move对编译器说的那样"我知道这是一个左值,它将被绑定到右值参考(参数),因此可能会被盗,但我知道我在做什么,这里没关系"我想在我的案例中说"我知道这是临时的,它将被绑定到一个可修改的左值引用(参数),因此通过左值引用所做的任何更改都会被忽略,但我知道我在做什么,这里没关系".

我可以通过从rvalue 初始化类型A 的命名对象,然后提供需要可修改左值引用的名称来解决问题.我不认为这有额外的运行时开销(无论如何都需要rvalue的临时开启),但是必须这样做在几个方面很尴尬:必须引入一个虚拟名称,可能只需引入一个复合语句保持声明,将产生rvalue的表达式与函数调用分开,它为其提供参数.我的问题是否可以在不引入虚拟名称的情况下完成:

  1. 是否有任何方法(例如使用强制转换)将类型A的rvalue表达式绑定到类型A的可修改左值引用并且不引入类型A的命名对象?
  2. 如果没有,这是一个刻意的选择吗?(如果是这样,为什么?)如果有,是否有类似于std::move标准提供的机制来促进它?

这是一个简化的插图,我需要这样的转换.我故意删除了A的特殊构造函数,以确保错误消息不涉及编译器决定引入的临时文件.当A&被替换时,所有错误都会消失const A&.

class A
{ int n;
public:
  A(int n) : n(n) {}
  A(const A&) = delete; // no copying
  A(const A&&) = delete; // no moving either
  int value() const { return n; }
};

int f(A& x) …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

6
推荐指数
2
解决办法
780
查看次数

函数双重到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++ ×3

c++11 ×3

move-semantics ×2

implicit-conversion ×1

return ×1