C++ C++;右值转发
根据Resharper的说法,这是无效的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
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
}
}
现在我的问题是:
我之所以能够弄明白这一点,是因为@imputudable提供了惊人的帮助 可以归结为以下事实:
- 右值引用会延长它们所持有的对象的生存期,直到它们超出范围
- Const左值引用的作用相同,但显然不能修改
- 非常量使用右值引用初始化的左值引用会不延长右值的生存期
- 由于引用崩溃,委托构造函数调用左值构造函数,而不是它本身
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
}