9

给定这两个修改并返回字符串的函数:

// 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++,但我不明白为什么/如何。我担心第二个函数会调用自己,让我失去控制的递归,直到堆栈耗尽。这能保证工作吗?

4

3 回答 3

9

您有两个重载函数:

std::string &modify( std::string &str )
std::string modify( const std::string &str )

你传递的是一个非 const-qualified std::string。因此,采用非 const 限定参数的函数更合适。如果不存在,编译器可以将非 const 限定字符串转换为 const 限定字符串以进行调用,但对于函数重载,不需要转换的调用比需要转换的调用更合适。

于 2013-05-01T19:48:17.223 回答
3
return modify( s ); // could this not call the "const" version again?

不,这不是递归。它将调用参数为 的另一个重载std::string &

这是因为表达式sstd::string &类型与其他重载函数的参数类型匹配。

为了递归,调用站点的参数需要转换为std::string const &. 但是在您的情况下,这种转换是不必要的,因为存在不需要转换的重载。

于 2013-05-01T19:45:48.440 回答
1

这不是递归,而是重载。当您调用第二个函数时,进入它的参数是一个常量字符串。在该函数内部,您调用另一个接受非常量字符串的函数。您正在做的是剥离字符串的 const-ness,而更好的方法是使用 const_cast。

我将链接到另一个 stackoverflow 线程。

于 2013-05-01T19:52:08.253 回答