如何为构造函数采用右值的类声明变量?

时间:2015-05-19 15:49:41

标签: c++ mongodb c++11

C ++ 11使用&&和&&amp ;;引入了rvalue参数的概念。运营商。如何声明一个类的变量,其构造函数将rvalue作为参数?我需要这样做,因为我想将一个成员变量添加到一个类中,该类允许我在构造函数中分配此变量,然后再使用它。我的直接示例是mongocxx::database,其(唯一)构造函数是:

database (database &&) noexcept;

MongoDB C++ documentation声明和分配中的示例在单个语句中初始化这样的变量,工作正常:

mongocxx::instance inst{};
mongocxx::client conn{};

auto db = conn["mydb"];

但只有在与声明相同的语句中完成赋值时才有效。你怎么做相当于以下的事情?

mongocxx::instance inst{};
mongocxx::client conn{};
mongocxx::database db;

db = conn["mydb"];

<小时/> 已更新,可根据评论中的建议将“分配”更改为“初始化”。

1 个答案:

答案 0 :(得分:2)

这两个:

struct conn_holder
{
   mongocxx::database db = conn["mydb"];
};

或者这个:

struct conn_holder
{
   conn_holder(mongocxx::database&& arg) : db(std::move(arg)) { }
   mongocxx::database db;
};

int main()
{
   conn_holder ch{conn["mydb"]};
}

应该有用。

请记住,conn_holder无法复制,只能移动,只有当您提供要移动到db成员的默认值时,它才能拥有默认构造函数。

在这种情况下推迟初始化的另一种方法是使用boost::optional来存储db,但是在使用之前你必须测试值是否存在。与数据成员一起使用的一些信息是here