преобразование lvalue в rvalue для неупорядоченной карты - PullRequest
1 голос
/ 04 апреля 2020

Получены параметры из внешней библиотеки:

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)));
}

1 Ответ

0 голосов
/ 04 апреля 2020

Вам не хватает перенести ваш входной аргумент на следующий получатель сказал-же. Это:

ctx->setConfigOverrides(config);

должно быть так:

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

Для правильной пересылки требуется это. Тот факт, что config был передан как rval-ссылка, не означает, что он не конкретен под капотом. Отличная статья о cppreference хорошо объясняет эту концепцию (не удивительно, этот сайт действительно потрясающий, и его следует добавить в закладки, если вы этого еще не сделали). И если вы думаете, что синтаксис сложен, он становится еще хуже с идеальной пересылкой через вывод шаблона. Спасибо, std::forward<> делает всю тяжелую работу там.

Во всяком случае, этого не хватало. Надеюсь, это поможет.

...