鉴于这两个函数修改并返回一个字符串:
// modify the original string, and for convenience return a reference to it
std::string &modify( std::string &str )
{
// ...do something here to modify the string...
return str;
}
// make a copy of the string before modifying it
std::string modify( const std::string &str )
{
std::string s( str );
return modify( s ); // could this not call the "const" version again?
}
这段代码适用于我使用GCC g ++,但我不明白为什么/如何。我担心第二个函数会调用自己,让我失控,直到堆栈耗尽为止。这可以保证有效吗?
答案 0 :(得分:9)
你有两个重载函数:
std::string &modify( std::string &str )
std::string modify( const std::string &str )
您传递的内容是非const限定std::string
。因此,采用非const限定参数的函数更适合。如果不存在,编译器可以将非const限定字符串转换为const限定字符串以进行调用,但是对于函数重载,不需要转换的调用比需要转换的电话。
答案 1 :(得分:3)
return modify( s ); // could this not call the "const" version again?
没有。它是不递归。它将调用参数为std::string &
的其他重载。
这是因为表达式s
的类型是std::string &
,它与另一个重载函数的参数类型匹配。
为了递归,呼叫站点的参数需要转换为std::string const &
。但在您的情况下,此转换是不必要,因为存在不需要转换的重载。
答案 2 :(得分:1)
这不是递归,而是超载。当你调用第二个函数时,进入它的参数是一个常量字符串。在该函数内部,您调用另一个采用非const字符串的函数。你正在做的是剥离字符串的常量,更好的方法是使用const_cast。