通过参考通过RVALUE

Pass rvalue by reference

本文关键字:RVALUE 参考      更新时间:2023-10-16

我正在努力将此代码变成单线:

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()的参数A const参考

    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)值,请执行此操作(即通话后,它现在可能指向一个新对象)。