C++ 汽车与汽车的区别&;和自动

C++ 汽车与汽车的区别&;和自动,c++,c++11,auto,rvalue-reference,C++,C++11,Auto,Rvalue Reference,所以,我做了这样一个课程,并推出了main: class my_class{ public: my_class(): status("constructor"){ cout << "constructor" << endl; } my_class(my_class&& obj): status("move constructor"){ cout << "move constructor"

所以,我做了这样一个课程,并推出了main:

class my_class{
public:
    my_class(): status("constructor"){
        cout << "constructor" << endl;
    }
    my_class(my_class&& obj): status("move constructor"){
        cout << "move constructor" << endl;
    }
    my_class(const my_class& obj): status("copy constructor"){
        cout << "copy constructor" << endl;
    }
    my_class& operator=(my_class&& obj){
        cout << "move assignment" << endl;
        return *this;
    }
    my_class& operator=(const my_class& obj){
        cout << "copy assignment" << endl;
        return *this;
    }
    ~my_class(){
        cout << "destructor; " << "object made by: " << status << endl;
    }
    string status;
};

my_class&& fun1(my_class&& temp){
    cout << "inside fun1" << endl;
    return move(temp);
}

my_class fun2(my_class&& temp){
    cout << "inside fun2" << endl;
    return move(temp);
}

int main(){
    auto&& testing_var1 = fun1(my_class{});
    auto&& testing_var2 = fun2(my_class{});
    auto testing_var3 = fun1(my_class{});
    auto testing_var4 = fun2(my_class{});
    return 0;
}
为什么fun1返回“testing_var3”时会使用move构造函数?当类型的推断是由auto而不是auto&&进行时,为什么会有这样的差异

我原以为会使用移动赋值,但fun1中的移动构造函数对我来说毫无意义

为什么在fun2中使用move构造函数?这不是搬家作业吗

/编辑:

我向构造函数和析构函数添加了一些额外的代码。现在我得到:

constructor
inside fun1
destructor; object made by: constructor
constructor
inside fun2
move constructor
destructor; object made by: constructor
constructor
inside fun1
move constructor
destructor; object made by: constructor
constructor
inside fun2
move constructor
destructor; object made by: constructor
destructor; object made by: move constructor
destructor; object made by: move constructor
destructor; object made by: move constructor
我的下一个问题是:为什么第一个变量是悬空引用而其他变量不是?为什么第二个变量不是@MattMcNabb建议的那样的引用

为什么fun1返回“testing_var3”时会使用move构造函数


testing\u var3
被推断为类型
my\u class
,因此必须调用构造函数来创建新的
my\u class
对象。因为右侧是临时的,所以选择了move构造函数

当类型的推断是由auto而不是auto&&进行时,为什么会有这样的差异

如果使用
auto&&
,则始终声明引用,并且当类的引用绑定到同一类类型的表达式时,不会调用构造函数,因为不会创建新对象<代码>自动从不声明引用

我原以为会使用移动赋值,但fun1中的移动构造函数对我来说毫无意义

为什么在fun2中使用move构造函数?这不是搬家作业吗

没有任务发生;只需复制初始化。在


尽管出现了
=
标记,但不会调用赋值运算符。这是初始化,不是赋值。赋值需要一个已经构造好的对象来赋值。

testing\u var3
是由move-ctor构造的,最后一个返回值是由move-ctor构造的


fun2
中没有赋值,只有需要构造/初始化的返回值。

我建议您阅读Scott Meyers关于“通用参考”的文章。auto&&可以绑定到左值或右值。在大多数情况下,除非您真的知道自己在做什么,否则您不需要使用auto&&。

这里不使用赋值,因为主函数中根本没有赋值。请注意,
testing\u var1
testing\u var2
都是悬空引用(如果添加析构函数输出,您会马上看到)-我理解,第一个临时文件的生命周期没有延长,但仍然不明白为什么第二个文件是悬空引用<代码>测试_var2是由move构造函数构造的,在main的末尾解构,所以在我看来它不像是悬挂的参考…你是对的<代码>1是悬空引用,但
2
不是。规则是,当绑定到prvalue时,右值引用会延长生存期,而当绑定到xvalue时则不会。谢谢你的回答!在第一个时刻,我并没有意识到并没有任何赋值,只有变量的初始化。
constructor
inside fun1
destructor; object made by: constructor
constructor
inside fun2
move constructor
destructor; object made by: constructor
constructor
inside fun1
move constructor
destructor; object made by: constructor
constructor
inside fun2
move constructor
destructor; object made by: constructor
destructor; object made by: move constructor
destructor; object made by: move constructor
destructor; object made by: move constructor
T x = e;
T x = braced-init-list;