通过引用传递右值

时间:2014-01-22 05:09:00

标签: c++ rvalue-reference

我正在努力将这段代码变成一个单行代码:

std::string filename = "cats";
std::shared_ptr<bmd2::Bmd2Dataset> ptr (new bmd2::Bmd2Dataset(filename, bmd2::File::FM_WRITE));
bmd2::bmd2Session::getInstance().addDataset(ptr);

以上效果很好 - 但是我可以在不创建左值(行1 + 2)的情况下调用addDataset吗?

这是addDataset()的声明:

int addDataset(std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception);

1 个答案:

答案 0 :(得分:3)

bmd2::bmd2Session::getInstance().addDataset(
   std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE)
);

一位州长。 :)

  

有趣。出于学习目的,您是否可以告诉我是否可以在没有make_shared()函数调用的情况下完成此操作?

您可以使用C ++ 11的大括号初始化语法。假设addDataset不是模板且其std::shared_ptr<bmd2::Bmd2Dataset>为参数,

bmd2::bmd2Session::getInstance().addDataset(
   { new bmd2::Bmd2Dataset("cats", bmd2::File::FM_WRITE) }
);

更新:糟糕。所以addDataset()实际上接受 l-value 引用为什么你不立即这么说?addDataset()的参数不能绑定到r值参数,在上面两个示例中都是如此。要解决此问题,您可以:

  • addDataset()的参数设为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)值(即在调用之后它可能指向新对象),请执行此操作。