C++ C++;11会导致我重写以下一些方法吗?

C++ C++;11会导致我重写以下一些方法吗?,c++,c++11,C++,C++11,我读了一些关于C++11移动语义的文章 现在我有更多的问题 是否需要添加副本构造 像ClassA(const ClassA&&) 我需要添加一个=覆盖吗 像operator=(ClassA&&) 我还需要做其他的改变吗 或者move semantic完全是关于编译器优化的,我不需要做任何事情?R值引用(&&)在C++03中不存在,如果类具有副本,C++11不会生成move ctor,如果类已经是赋值,则不会生成transfer assign 所以,如果你只是让你的代码保持原样,它就会像C++03

我读了一些关于C++11移动语义的文章

现在我有更多的问题

  • 是否需要添加副本构造

    ClassA(const ClassA&&)

  • 我需要添加一个=覆盖吗

    operator=(ClassA&&)

  • 我还需要做其他的改变吗

    或者move semantic完全是关于编译器优化的,我不需要做任何事情?

    R值引用(
    &&
    )在C++03中不存在,如果类具有副本,C++11不会生成move ctor,如果类已经是赋值,则不会生成transfer assign

    所以,如果你只是让你的代码保持原样,它就会像C++03那样工作

    命令,对于未定义ctor和assign的类,编译器将生成一些

    • class::class()
      -通常的默认值,它调用基和成员默认值
    • class::class(const class&)
      -通常的副本,它调用基本副本和成员副本
    • class::class(class&&)
      -一种“move-ctor”,用于逐个成员调用基和成员move
    • class&class::operator=(const class&)
      -调用base和member by member copy的通常按副本赋值
    • class&class::operator=(lass&&)
      -按传输分配,调用基和成员逐个传输
    • class::~class()
      dtor,按相反顺序调用mebers和base sdtor
    现在,如果您实现了justcopy,那么移动默认值将与传输分配一起删除,从而导致任何“移动”操作(复制或分配临时或“转换为临时”)绑定到副本,从而恢复旧的C++03行为

    如果您只执行“移动”,则会删除复制(和分配),从而导致类“仅可移动”(例如,就像
    std::unique\u ptr

    如果您同时实现了这两个功能,那么您就可以定义移动与复制的不同之处。

    您尝试过吗

    class(class&&other)=默认值;
    类别(常量类别和其他)=默认值;

    注意,只有当类的所有成员都是可移动/可复制的时,这才有效。 如果使用默认副本Cons.,指针将指向与原始文件相同的位置


    正如@Emilio所说的,如果您自己定义了一个复制向量,那么要求编译器生成默认的移动向量是不合适的,因为这可能会导致问题。

    您应该为任何具有大量数据并且您计划制作临时拷贝的对象添加移动语义(比如从某个函数返回值)。您可以同时定义和复制并移动构造函数,这样您就不会重写任何内容。据我所知,
    const ClassA&&
    应该是非法的,或者至少不符合您的预期。移动语义通常会更改传递的对象,这与传递
    const
    引用的点相反。谢谢,并更改了问题。在复制构造函数中,我使用a=rhl.a;b=rhl.b;如何使用移动构造函数实现?@AdamLee:
    :a(rhl.a);b(rhl.b){
    。事实上,就像你应该在复制ctor中做的那样。但是如果你只是做memberwise复制,为什么还要有一个复制ctor?移动构造函数只对右值有用,是吗?如果我有一个L值,我需要同时有移动ctor和复制ctor?从你的例子中,我看不到移动ctor的任何好处,它的实现与复制ctor相同?移动c只有当tor的实现方式与副本不同时,它才有意义。而只有当它不仅仅是一个成员副本时,copy ctor才有意义。如果不存在r值复制操作,复制r值只会调用l值副本:
    a&&&
    隐式转换为
    const a&