相关疑难解决方法(0)

什么是移动语义?

我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?

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

1614
推荐指数
11
解决办法
39万
查看次数

保证副本省略如何运作?

在2016年奥卢ISO C++标准会议上,标准委员会将一项名为" 保证副本省略"的提案通过简化的价值类别投票进入C++ 17.

保证副本省略如何运作?是否涵盖了某些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

c++ copy-elision c++17

75
推荐指数
1
解决办法
7883
查看次数

何时是通过右值参考返回的好时机?

在阅读了大量有关右值参考的文章后,我知道:

std::string&& f_wrong()
{
    std::string s("hello");
    return std::move(s);
}
Run Code Online (Sandbox Code Playgroud)

是错的,并且:

std::string f_right()
{
    std::string s("hello");
    return s;
}
Run Code Online (Sandbox Code Playgroud)

足以使std::string(或任何移动可构造类)的移动构造函数被调用.此外,如果要使用返回值来构造对象,则应用命名返回值优化(NRVO),该对象将直接在目标地址处构造,因此不会调用移动构造函数:

std::string s = f_right();
Run Code Online (Sandbox Code Playgroud)

我的问题是:何时是通过右值引用返回的好时机?就我所能想到的而言,似乎返回一个右值引用除了像std::move()和之类的函数之外没有意义std::forward().这是真的吗?

谢谢!

参考

C++ 0x:人们理解右值引用吗?| Pizer的博客

通过右值参考返回

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

通过右值参考返回更有效吗?

c++ rvalue-reference move-semantics return-value-optimization c++11

6
推荐指数
0
解决办法
144
查看次数

返回由右值引用传递的参数

如果我有课A和功能

A f(A &&a)
{
  doSomething(a);
  return a;
}
A g(A a)
{
  doSomething(a);
  return a;
}
Run Code Online (Sandbox Code Playgroud)

返回时,拷贝构造函数被调用af,但返回时移动的构造函数使用g.但是,根据我的理解,f只能传递一个可以安全移动的对象(临时或标记为可移动的对象,例如,使用std::move).有什么例子,当从返回时使用移动构造函数是不安全的f吗?为什么我们要求a有自动存储时间?

我在这里阅读了答案,但最顶层的答案只表明规范不应允许在传递a给函数体中的其他函数时移动; 它没有解释为什么在返回时移动是安全的g但不是安全的f.一旦我们到达return语句,我们就不再需要af.

更新0

所以我理解临时表可以在完整表达结束之前访问.然而,从f仍然返回时的行为似乎违背了根深蒂固的语义,即移动临时或xvalue是安全的.例如,如果您调用g(A()),临时将移动到参数中,g即使可能存在对某处临时存储的引用.如果我们g使用xvalue 调用,也会发生同样的情况.因为只有temporaries和xvalues绑定到rvalue引用,所以看起来我们a在返回时仍应该移动的语义是一致的f,因为我们知道a传递了临时或xvalue.

c++ return move-semantics pass-by-rvalue-reference

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

复制ctor调用而不是移动ctor

为什么在从而bar不是移动构造函数返回时调用复制构造函数?

#include <iostream>

using namespace std;

class Alpha {
public:
  Alpha() { cout << "ctor" << endl; }
  Alpha(Alpha &) { cout << "copy ctor" << endl; }
  Alpha(Alpha &&) { cout << "move ctor" << endl; }
  Alpha &operator=(Alpha &) { cout << "copy asgn op" << endl; }
  Alpha &operator=(Alpha &&) { cout << "move asgn op" << endl; }
};

Alpha foo(Alpha a) {
  return a; // Move ctor is called (expected).
}

Alpha bar(Alpha …
Run Code Online (Sandbox Code Playgroud)

c++ constructor copy-constructor move-constructor c++11

5
推荐指数
1
解决办法
180
查看次数