通过参考通过RVALUE
Pass rvalue by reference
我正在努力将此代码变成单线:
std::string filename = "cats";
std::shared_ptr<bmd2::Bmd2Dataset> ptr (new bmd2::Bmd2Dataset(filename, bmd2::File::FM_WRITE));
bmd2::bmd2Session::getInstance().addDataset(ptr);
上面的功能很棒 - 但是我可以在不创建lvalues(第1 2行)的情况下调用AddDataset吗?
这是AddDataset()的声明:
int addDataset(std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception);
bmd2::bmd2Session::getInstance().addDataset(
std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE)
);
一个说明器。:)
有趣。出于学习目的,您能告诉我是否可以无需make_shared()函数调用即可完成此操作?
您可以使用C 11的Brace初始化语法。假设addDataset
不是模板,并且具有std::shared_ptr<bmd2::Bmd2Dataset>
作为其参数,
bmd2::bmd2Session::getInstance().addDataset(
{ new bmd2::Bmd2Dataset("cats", bmd2::File::FM_WRITE) }
);
更新:糟糕。因此,addDataset()
实际上接受 l-value 参考addDataset()
的参数无法绑定到R-Value参数,在以上两个示例中。要解决这个问题,您可以:
制作
addDataset()
的参数Aconst
参考int addDataset(const std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception); // ^^^^^
如果您不需要修改传递的
shared_ptr
参数(即修改它,以便将其指向另一个对象)。使用旧方法,
,尽管将中。更新:使用"cat"
直接传递到new
表达式std::make_shared
!auto ptr = std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE); bmd2::bmd2Session::getInstance().addDataset(ptr); // ptr might now point to some other object
如果要更改传递的参数(
ptr
)值,请执行此操作(即通话后,它现在可能指向一个新对象)。
相关文章:
- RVALUE参考与const lVALUE参考作为参数之间的混淆
- 如何使对象通过RVALUE参考通过而没有复制
- RVALUE参考与LVALUE结合
- RVALUE参考和多态性
- 是转发参考是否仍然是RVALUE参考
- 在平等符号左侧使用RVALUE参考的规则是什么?
- 为什么const rvalue合格的std ::可选:: value()返回const rvalue参考
- C 11:为什么RVALUE参考参数隐式转换为LVALUE
- 模板功能不使用RVALUE参考实例化/接收呼叫
- 作为RVALUE参考与双移动值的传递
- rvalue参考vector :: push_back函数如何提高效率
- 函数返回rvalue参考是否有意义
- 用rvalue参考和变异模板bits bits bys blamda by
- 移动后通过rvalue参考返回
- 为什么STD :: MOVE将RVALUE参考作为参数
- 成员函数返回成员变量的RVALUE参考
- 反复调用MOVE,其中需要RVALUE参考
- 产生副本作为输入,以获取RVALUE参考
- C 接收const lvalue和rvalue参考参数,而无需过载
- rvalue参考绑定到std ::功能类型的LVALUE