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

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-&gt;setConfigOverrides(std::move(config)); 评论是什么意思?我已经从代码中删除了一些复杂性。 意思是ctx-&gt;setConfigOverrides(config);的那一行应该是ctx-&gt;setConfigOverrides(std::move(config));,不管你有没有意识到,你都用问题回答了。 成功了。除非我对 C++ 有更多了解。你想把它作为答案发布吗?其他人会更容易找到它。 【参考方案1】:

你错过了将你的输入参数转移到下一个相同的接收者。这个:

ctx->setConfigOverrides(config);

应该是这样的:

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

正确的转发需要它。仅仅因为 config 作为 rval-reference 传入并不意味着它在引擎盖下不是具体的。 cppreference 上的一篇优秀文章很好地解释了这个概念(不足为奇;那个网站真的很棒,如果你还没有收藏的话,应该加入书签)。如果你认为语法很复杂,那么通过模板推导完美转发会变得更糟。谢天谢地,std::forward&lt;&gt; 在那里完成了所有繁重的工作。

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

【讨论】:

以上是关于无序映射的左值到右值转换的主要内容,如果未能解决你的问题,请参考以下文章

C++ 传递向量(左值到右值)

右值到左值转换 Visual Studio

c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)

C++:神一样的左值

C++的左值 右值 左值引用 右值引用 大白话总结

C++11 中的左值引用和右值引用的区别