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

标签 c++ mongodb c++11

C++11 使用 && 运算符引入了右值参数的概念。如何声明其构造函数采用右值作为参数的类的变量?我需要这样做,因为我想向类添加一个成员变量,以便我可以在构造函数中分配该变量,然后在以后使用它。我的直接例子是 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"];


按照评论中的建议进行了更新,将“分配”更改为“初始化”。

最佳答案

这两个:

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 中的默认值时,它才可以有默认构造函数> 成员(member)。


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

关于c++ - 如何为其构造函数采用右值的类声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30330349/

相关文章:

c++ - 嵌套循环中迭代器的行为与 C++ 中的随机访问

node.js - MongoJS 增加池大小

C++ std::bind 到 std::function,在 VS2015 中出了什么问题?

c++ - 出现在可变模板参数包的任何位置的类型的类模板的部分特化

c++ - 访问实现接口(interface)但不属于接口(interface)的类的函数

c++ - 在不使用 abs 函数或 if 语句的情况下获取绝对值

c++ - 使用三元条件运算符时不兼容的操作数类型

mongodb - 在 mongodb 中四舍五入到小数点后两位

mongodb - 使用 mongo-go-driver 和接口(interface)将游标反序列化为数组

c++ - 比较 C++11 中的数组地址