失败时返回已移动函数参数是否合规?有无更优实现方案?
异常场景下返回已移动的函数参数是否属于可接受的编程模式?
当出现异常情况时,返回已移动的函数参数是否属于可接受的编程模式?比如尝试将数据存储到数据库但验证失败,需要返回数据句柄的场景。
class Database { using data_ptr = std::unique_ptr<std::vector<int>>; public: [[nodiscard]] std::expected<void, data_ptr> validate_and_store(data_ptr&& data) { if(!validate_data(data)) { return std::unexpected(std::move(data)); } m_data = std::move(data); return {}; } private: data_ptr m_data; static bool validate_data(data_ptr& data) {return data->size() < 6;} };
validate_and_store的右值参数表明通常会转移数据所有权,但在异常情况下会返回该数据的句柄。调用方可以按如下方式使用:
Database db; auto data_owner = get_big_data_from_somewhere(); auto db_info = db.validate_and_store(std::move(data_owner)); if(!db_info) { data_owner = std::move(db_info.error()); }
对于*“成功时移交所有权,失败时将所有权返回给调用者”*的需求,是否存在更优(或最佳)实践?当然可以使用非const引用并在后续检查nullptr,但这种方式无法清晰体现预期行为。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

