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"];
<小时/> 已更新,可根据评论中的建议将“分配”更改为“初始化”。
答案 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。