c++ - 左值到右值的无序映射转换

标签 c++ rvalue lvalue

从外部库接收参数:

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(config);

应该是这样的:
ctx->setConfigOverrides(std:move(config));

正确的转发需要它。仅仅因为config是作为rval-reference传入的,并不意味着它在幕后并不具体。关于cppreference的出色文章很好地解释了这个概念(不足为奇;该站点确实很棒,如果尚未添加书签,则应添加书签)。而且,如果您认为语法很复杂,则通过模板推导进行完美转发会变得更糟。谢谢,std::forward<>在那里完成了所有繁重的工作。

无论如何,那是缺少的东西。希望能帮助到你。

关于c++ - 左值到右值的无序映射转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61029610/

相关文章:

c++ - 如何调用 'call by value '和 'call by reference'重载函数?

c++ - union 成员之间的分配

c - C中的二叉搜索树删除节点

c++ - 如何在内核中添加包含库的路径?

c++ - 为什么 std::forward 将左值和右值转换为右值引用?

c++ - Mac OS X 10.7.4 和 FreeBSD 9.0 上没有右值引用

c++ - 是否可以调用一个以 const 右值作为参数的函数?

c++ - MSVC++ 使用基本运算符 = 重载左值而不是右值?

c++ - 将 WSAGetLastError 转换为 std::exception?

c++ - 如何减少 C/C++ 浮点舍入