Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;右值转发_C++_Move Semantics_Rvalue Reference - Fatal编程技术网

C++ C++;右值转发

C++ C++;右值转发,c++,move-semantics,rvalue-reference,C++,Move Semantics,Rvalue Reference,根据Resharper的说法,这是无效的c++: class IData{ IData(); virtual doStuff() = 0; } class MyData: public IData{ MyData(MyData&& mdrv); doStuff() override{/*....*/}; } class DataUser(){ DataUser(IData& d){ //all explicits are omm

根据Resharper的说法,这是无效的c++:

class IData{
    IData();
    virtual doStuff() = 0;
}
class MyData: public IData{
    MyData(MyData&& mdrv);
    doStuff() override{/*....*/};
}
class DataUser(){
    DataUser(IData& d){   //all explicits are ommitted for brevity, don't call me out on that please :)
        d.doStuff();
    }
}
int main(){
    DataUser d(MyData()); //it complains here: Binding Rvalue Reference to lvalue Reference is a non standard MSVC extension
}
我不能使IData和const,因为doStuff做东西(duh!)

我所做的是:

 class DataUser(){
     DataUser(IData& d){
         d.doStuff();
     }
     DataUser(IData&& d): DataUser(d){  //added this, no complains anywhere
     }
 }
现在我的问题是:

  • 是C++中第一个不符合标准的?
  • 添加我的作弊构造函数如何改变任何事情,它符合标准吗
  • 如果这两种方法都无效(我担心这一点),我怎么能创建一个作弊的构造函数2.0,让我通过一个非常量右值呢?[请不要使用模板perferct转发,我希望将我的源代码完全保留在.cpp中]所有IData都具有有效的移动构造函数和赋值运算符

  • 我之所以能够弄明白这一点,是因为@imputudable提供了惊人的帮助

    可以归结为以下事实:

    • 右值引用会延长它们所持有的对象的生存期,直到它们超出范围
    • Const左值引用的作用相同,但显然不能修改
    • 非常量使用右值引用初始化的左值引用会延长右值的生存期
    • 由于引用崩溃,委托构造函数调用左值构造函数,而不是它本身
    可以找到其他资源(同样由@imputable提供)

    这就是为什么

    class DataUser(){
        DataUser(IData& d){ 
            d.doStuff();
        }
    }
    int main(){
        DataUser d(MyData()); //lvalue ref is initalized  with rvalue, Rvalue goes out of scope --> UB
    }
    
    但是


    AFAIK临时表只能绑定到
    const
    references或rvalue references。更多信息@ChrisB,案例2可以。@ChrisB,阅读链接的文档。。。如果仍然没有意义,请阅读关于Let-us的文档。另外,您可能想知道,您正在两次致电doStuff()获取右值。谢谢提醒!复制粘贴错误:它不会编译成这样,因为C++只支持委托构造函数。现在编辑。
    class DataUser(){
            DataUser(IData& d){ 
                d.doStuff();
            }
            DataUser(IData&& d): DataUser(d){ //the rvalues lifetime is extended until the constructor exits and d goes out of scope
            }
        }
        int main(){
            DataUser d(MyData()); //this works like a charm and is perfectly legal
        }