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/