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成员的默认值时,它才能具有默认构造函数。

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

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

10-16 21:01
查看更多