什么保证调用重载的非const方法?

时间:2013-05-01 19:40:42

标签: c++ recursion signature

鉴于这两个函数修改并返回一个字符串:

// 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 ++,但我不明白为什么/如何。我担心第二个函数会调用自己,让我失控,直到堆栈耗尽为止。这可以保证有效吗?

3 个答案:

答案 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。

I'll just link to this other stackoverflow thread.