无序映射的左值到右值转换

lvalue to rvalue conversion for unordered map

收到来自外部库的参数:

candidate function not viable: no known conversion from 'std::unordered_map<string, string>' to 'std::unordered_map<string, string> &&' (aka 'unordered_map<basic_string<char>, basic_string<char> > &&') for 1st argument

void someMethod(shared_ptr<Context> ctx, std::unordered_map<string, string>&& config) {
    ctx->setConfigOverrides(config);
}

// From Context :
// I can't change following method :
void setConfigOverrides(
    std::unordered_map<string, string>&& configOverrides) {
    setConfigOverrides(make_shared<const MemConfig>(move(configOverrides)));
}

您缺少将输入参数移至 said-same 的下一个接收者。这个:

ctx->setConfigOverrides(config);

应该是这样的:

ctx->setConfigOverrides(std:move(config));

正确的转发需要它。仅仅因为 config 作为 rval-reference 传入并不意味着它不是具体的。 cppreference 上的一篇优秀文章很好地解释了这个概念(不足为奇;该网站真的很棒,如果您还没有收藏的话应该收藏)。如果您认为语法很复杂,那么通过模板推导使用 perfect-forwarding 会变得更糟。值得庆幸的是,std::forward<> 在那里完成了所有繁重的工作。

无论如何,这就是所缺少的。希望对你有帮助。