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/