无序映射的左值到右值转换
Posted
技术标签:
【中文标题】无序映射的左值到右值转换【英文标题】:lvalue to rvalue conversion for unordered map 【发布时间】:2020-04-04 14:29:58 【问题描述】:从外部库接收参数:
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)));
【问题讨论】:
你有没有可能ctx->setConfigOverrides(std::move(config));
评论是什么意思?我已经从代码中删除了一些复杂性。
意思是ctx->setConfigOverrides(config);
的那一行应该是ctx->setConfigOverrides(std::move(config));
,不管你有没有意识到,你都用问题回答了。
成功了。除非我对 C++ 有更多了解。你想把它作为答案发布吗?其他人会更容易找到它。
【参考方案1】:
你错过了将你的输入参数转移到下一个相同的接收者。这个:
ctx->setConfigOverrides(config);
应该是这样的:
ctx->setConfigOverrides(std:move(config));
正确的转发需要它。仅仅因为 config
作为 rval-reference 传入并不意味着它在引擎盖下不是具体的。 cppreference 上的一篇优秀文章很好地解释了这个概念(不足为奇;那个网站真的很棒,如果你还没有收藏的话,应该加入书签)。如果你认为语法很复杂,那么通过模板推导完美转发会变得更糟。谢天谢地,std::forward<>
在那里完成了所有繁重的工作。
无论如何,这就是缺少的。希望对您有所帮助。
【讨论】:
以上是关于无序映射的左值到右值转换的主要内容,如果未能解决你的问题,请参考以下文章