You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将set中每个string传入递归函数?解决左值/右值绑定错误

Wordle递归函数编译错误修复

问题场景

实现Wordle递归函数时,定义了存储string的set容器possibleList,尝试将其中每个string传入wordle函数递归调用,但触发编译错误:无法将std::string类型的右值绑定到std::string&类型的非const左值引用。

代码示例

#include <iostream>
#include <algorithm> 
#include <map>
#include <set>
using namespace std;

set<string> wordle(string& in, string& floating, set<string>& dict){
    set<string> possibleList;
    int length = in.length();
    for(int i = 0; i<length;i++){
        cout <<"line 1: "<<char(in[i])<<endl;
        if (in[i] == '-'){
            for(int j = 97; j<=122; j++){
                in[i]=char(j);
                possibleList.insert(in);
            }
            set<string>::iterator itr;
            for (itr = possibleList.begin(); itr != possibleList.end(); itr++)
            { 
                wordle(string(*itr), floating, dict);  // +++ERROR LINE+++  (LINE 40)
            }
        }
    }
    return possibleList;
}

int main(){
    string in = "--pl-";
    string floating = "ae";
    set<string> dict;
    dict.insert("joshua");
    dict.insert("phone");
    dict.insert("apple");
    dict.insert("aepll");
    dict.insert("eapll");
    dict.insert("ae");
    wordle(in, floating, dict);
    return 0;
}

错误信息

main.cpp: In function ‘std::set<std::__cxx11::basic_string<char> > wordle(std::string&, std::string&, std::set<std::__cxx11::basic_string<char> >&)’:
main.cpp:40:24: error: cannot bind non-const lvalue reference of type ‘std::string&’ {aka ‘std::__cxx11::basic_string&’} to an rvalue of type ‘std::string’ {aka ‘std::__cxx11::basic_string’}
   40 |                 wordle(string(*itr), floating, dict);
      |                        ^~~~~~~~~~~~

错误原因

wordle函数的第一个参数是非const左值引用(string&),而你传入的string(*itr)是临时构造的std::string对象(右值)。C++语法规则禁止将右值绑定到非const左值引用——非const引用意味着允许修改对象,但临时对象生命周期极短,修改它无意义且易引发问题。

修复方案

方案1:将函数参数改为const引用

如果递归过程中不需要修改in的原始值,把函数参数声明改为const string&,同时对其他无需修改的参数也添加const限定:

// 修改函数签名
set<string> wordle(const string& in, const string& floating, const set<string>& dict){
    set<string> possibleList;
    int length = in.length();
    for(int i = 0; i<length;i++){
        cout <<"line 1: "<<char(in[i])<<endl;
        if (in[i] == '-'){
            // 因in为const,需创建副本修改
            string temp = in;
            for(int j = 97; j<=122; j++){
                temp[i]=char(j);
                possibleList.insert(temp);
            }
            set<string>::iterator itr;
            for (itr = possibleList.begin(); itr != possibleList.end(); itr++)
            { 
                wordle(*itr, floating, dict);  // 直接传迭代器指向的对象,无需构造临时变量
            }
        }
    }
    return possibleList;
}

注意:原代码直接修改in会污染原始输入,改用临时副本temp处理占位符'-'更合理。

方案2:先创建临时变量再传递

如果确实需要在递归中修改传入的字符串,先将迭代器指向的内容赋值给临时变量,再传递这个左值:

for (itr = possibleList.begin(); itr != possibleList.end(); itr++)
{ 
    string temp_str = *itr;
    wordle(temp_str, floating, dict);  // 传递左值临时变量,符合非const引用要求
}

这种方式无需修改函数签名,且递归修改的是临时变量,不会影响集合中的原始元素。

额外提示

原代码中直接修改in参数会导致后续循环使用被修改后的字符串,可能偏离预期逻辑,建议始终使用临时副本处理占位符替换操作。

内容的提问来源于stack exchange,提问作者filthysasuke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:55:15